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

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

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

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

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

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

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

4 ответов


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

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

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


Свифт

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

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

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 чтобы получить выбранный индекс студента. Затем, чтобы показать, какой элемент выбран, я сделал:

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 клетка делает это автоматически.


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