Как выбрать элемент в 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)