Как включить множественный выбор в UICollectionView, используя конфигурацию списка в iOS 14?

#ios

#iOS

Вопрос:

Я пытаюсь реализовать приложение iOS Messages в стиле выбора: все строки имеют галочку слева в режиме редактирования.

Я использую UICollectionView с конфигурацией списка, представленной Apple в iOS 14, и, похоже, реализация множественного выбора изменилась.

Примите Modern Collection Views/Lists/ReorderableListViewController.swift участие в реализации современных представлений коллекции для exmaple.

Это было то, что я сделал:

  1. Добавлен следующий код внизу viewDidLoad :
  navigationItem.setLeftBarButton(editButtonItem, animated: true)
 collectionView.allowsMultipleSelection = true
 collectionView.allowsMultipleSelectionDuringEditing = true
  
  1. setEditing Метод переопределения:
 override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: true)
    self.collectionView.isEditing = editing
}
  
  1. Реализовать UICollectionViewDelegate :
 extension ReorderableListViewController: UICollectionViewDelegate {
  func collectionView(_ collectionView: UICollectionView,
                      shouldBeginMultipleSelectionInteractionAt indexPath: IndexPath) -> Bool {
    return true
  }
  
  func collectionView(_ collectionView: UICollectionView,
                      didBeginMultipleSelectionInteractionAt indexPath: IndexPath) {
    print(#function)
    self.collectionView.isEditing = true
  }
}
  
  1. Отображать дескриптор изменения порядка только в режиме редактирования (в configureDataSource ):
 cell.accessories = [.disclosureIndicator(), .reorder(displayed:.whenEditing)]
  

Благодаря этим изменениям я вижу, что дескриптор reoder переключается при нажатии кнопки редактирования. Но слева нет флажка для указания текущих выбранных элементов.

Ответ №1:

Попробуйте сделать это:

 collectionView.allowsMultipleSelection = false

cell.accessories = [
  .disclosureIndicator(),
  .reorder(displayed:.whenEditing),
  .multiselect()
]
  

Галочки будут отображаться в режиме редактирования.

Ответ №2:

Я понял, как это сделать. Используйте пользовательский аксессуар и поместите его в начало.

В configureDataSource ‘s cellRegistration :

 let checkmark = UIImage(systemName: "checkmark.circle.fill")           
let checkmarkImageView = UIImageView(image: checkmark)
let checkmarkViewConguration = UICellAccessory.CustomViewConfiguration(
    customView: checkmarkImageView,
    placement: .leading(displayed: .whenEditing, at: { _ in 0 }))

cell.accessories = [
    .customView(configuration: checkmarkViewConguration),
    .disclosureIndicator(), 
    .reorder(displayed:.whenEditing)
]