Подтвердить что ты не робот

Как программно выбрать элемент в коллекции?

У меня есть UICollectionView. UICollectionView datasource UICollectionView является NSArray студентов (из CoreData). Я хочу, чтобы текущий элемент ученика был selected/highlighted.

Как я могу это сделать? Я знаю, что есть метод:

- (void)selectItemAtIndexPath:(NSIndexPath *)indexPath 
                     animated:(BOOL)animated 
               scrollPosition:(UICollectionViewScrollPosition)scrollPosition;

который принимает в качестве аргументов NSIndexPath и UICollectionViewScrollPosition.

У меня есть источник данных (NSArray студентов, заполненных из CoreData), и объект-ученик, который нужно selected.

Итак, как мне получить NSIndexPath и UICollectionViewScrollPosition? Или есть другой способ выделить элемент?

4b9b3361

Ответ 1

Вы можете просто использовать это после [self.collectionView reloadData]

[self.collectionView 
   selectItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0] 
                animated:YES
          scrollPosition:UICollectionViewScrollPositionCenteredVertically];

где index - номер индекса для выбранного учащегося.

Ответ 2

Swift

let indexPath = self.collectionView.indexPathsForSelectedItems?.last ?? IndexPath(item: 0, section: 0)
self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: UICollectionView.ScrollPosition.centeredHorizontally)

Ответ 3

Из вашего вопроса я предполагаю, что у вас только один выбранный ученик, я сделал аналогичную вещь с коллекцией значков, которые пользователь мог выбрать. Во-первых, я сделал загрузку:

override func viewDidLoad() {
    super.viewDidLoad()

    iconCollectionView.delegate = self
    iconCollectionView.dataSource = self
    iconCollectionView.allowsMultipleSelection = false
    iconCollectionView.selectItemAtIndexPath(NSIndexPath(forItem: 0, inSection: 0), animated: false, scrollPosition: .None)
}

Здесь я по умолчанию StudentArray.indexOf первую ячейку, вы бы использовали StudentArray.indexOf для получения выбранного студенческого индекса. Затем, чтобы показать, какой элемент выбран, я сделал:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = iconCollectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! IconCollectionViewCell
    cell.imageView.image = UIImage(named: imageResourceNames.pngImageNames[indexPath.row])
    if cell.selected {
        cell.backgroundColor = UIColor.grayColor()
    }
    return cell
}

Это вызывается, когда сбор сначала отображается, а затем реагирует на изменения в выборе:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    collectionView.cellForItemAtIndexPath(indexPath)?.backgroundColor = UIColor.grayColor()
}

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
    collectionView.cellForItemAtIndexPath(indexPath)?.backgroundColor = UIColor.clearColor()
}

Очевидно, есть много способов показать выбор клеток, мой путь прост, но все, что мне нужно было сделать.

EDIT: после публикации выше я понял, что проще просто добавить наблюдателя к selected в классе ячеек:

class IconCollectionViewCell: UICollectionViewCell {

...

    override var selected: Bool {
        didSet {
            backgroundColor = selected ? UIColor.grayColor() : UIColor.clearColor()
        }
    }
}

При этом на месте нет необходимости обрабатывать didSelect или didDeselect или проверять, выбрано ли в cellForItemAtIndexPath, ячейка делает это автоматически.

Ответ 4

let indexPathForFirstRow = IndexPath(row: 0, section: 0)
    paymentHeaderCollectionView.selectItem(at: indexPathForFirstRow, animated: false, scrollPosition: UICollectionViewScrollPosition.left)
    self.collectionView(paymentHeaderCollectionView, didSelectItemAt: indexPathForFirstRow)

Ответ 5

в подписи есть изменения.

didSelectItemAtIndexPath  to didSelectItemAt 

пожалуйста, проверьте это:

_ collectionView

попробуйте с этим, пожалуйста:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){

        print(" selected",)
    }