Ответ 1
Вы можете выполнить итерацию по - [UICollectionView indexPathsForSelectedItems]
:
for (NSIndexPath *indexPath in [self.collectionView indexPathsForSelectedItems]) {
[self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
}
У меня разрешено использование MultipleSelection в виде коллекции. Клетки меняются на выбранные состояния при нажатии. Все хорошо. Однако, когда я хочу reset весь вид выбранного состояния: НЕТ, используя приведенный ниже код, ячейки кажутся полностью отмененными, пока я не сделаю новый выбор, и в этот момент все ранее выбранные ячейки отображают свое ранее выбранное состояние.
то есть. несмотря на появление, коллекция не обновляет текущий список выбора, когда я программно отменяет выбор ячеек
- (void)clearCellSelections {
for (LetterCell *cell in self.collectionView.visibleCells) {
[cell prepareForReuse];
}
}
В пользовательской ячейке:
- (void)prepareForReuse
{
[super prepareForReuse];
[self setSelected:NO];
}
Что я делаю неправильно? Есть ли другой способ отменить выбор всех ячеек?
Спасибо TBlue за то, что вы посмотрели
Вы можете выполнить итерацию по - [UICollectionView indexPathsForSelectedItems]
:
for (NSIndexPath *indexPath in [self.collectionView indexPathsForSelectedItems]) {
[self.collectionView deselectItemAtIndexPath:indexPath animated:NO];
}
Можно сказать, что UITableViewCell.selected
устанавливает только "видимое состояние/внешний вид" ячейки и ее содержимое. Вы можете отменить выбор ячеек, итерации по всем indexPaths tableView и вызова deselectRowAtIndexPath:animated:
для каждого из них.
Например:
for (int i=0; i < self.myData.count; i++) {
[self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] animated:YES];
}
EDIT. Я полностью согласен с комментариями @BenLings и @JeremyWiebe, что решение @qorkfiend предпочтительнее этого.
Самый простой способ отменить выбор всех выделенных ячеек в UICollectionView
- это просто передать nil
в качестве первого аргумента collectionView.selectItem(at:, animated:, scrollPosition:)
. Например.
collectionView.selectItem(at: nil, animated: true, scrollPosition: [])
очистит текущее состояние выбора, даже если allowsMultipleSelection == true
.
На всякий случай это простое решение в Swift:
extension UICollectionView {
func deselectAllItems(animated animated: Bool = false) {
for indexPath in self.indexPathsForSelectedItems() ?? [] {
self.deselectItemAtIndexPath(indexPath, animated: animated)
}
}
}
Для быстрого 3 расширения будет выглядеть так:
import UIKit
extension UICollectionView {
func deselectAllItems(animated: Bool = false) {
for indexPath in self.indexPathsForSelectedItems ?? [] {
self.deselectItem(at: indexPath, animated: animated)
}
}
}
Я создал глобальную переменную, называемую toggleCellSelection, затем запустил ее в функции didSelectItemAt:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
print("select cell \(indexPath.row)")
let cell = collectionView.cellForItem(at: indexPath)
if (toggleCellSelection == true) {
toggleCellSelection = false
cell?.layer.borderWidth = 0
cell?.layer.borderColor = UIColor.clear().cgColor
} else {
toggleCellSelection = true
cell?.layer.borderWidth = 5
cell?.layer.borderColor = #colorLiteral(red: 0.8779790998, green: 0.3812967837, blue: 0.5770481825, alpha: 1).cgColor
}
}