Могу ли я иметь несколько разделов CollectionView для одного выбора, а другие для множественного выбора? - PullRequest
0 голосов
/ 27 июня 2019

Некоторые из моих разделов CollectionView должны позволять пользователям выбирать только отдельные опции, а другие должны позволять пользователям выбирать любую сумму в этом разделе.Как создать CollectionView таким образом, чтобы некоторые разделы допускали множественный выбор, а другие - только один?

Я создаю приложение для доставки еды, в котором пользователям предлагается выбрать из экрана выбора для настройки своего заказа (т. Е.сбор уровня сахара или выбор дополнительного напитка).В настоящее время у меня есть список настраиваемых опций, отображаемых как один UICollectionView с различными разделами, определяющими, что именно они хотели бы настроить.Для пояснения в заголовке раздела может быть указано «Выберите свой напиток», а в ячейках этого раздела будут перечислены «Кокс», «Пепси» и т. Д.

class MenuDetailVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var item: MenuItem?
    var cvCellID = "collectionviewid"
    var masterCustomizables: [MasterCustomize]?

    override func viewDidLoad() {
        super.viewDidLoad()
        masterCustomizables = item?.customizables
        setupCV()
    }
//...

    func setupCV() {
        masterCollectionView.dataSource = self
        masterCollectionView.delegate = self
        masterCollectionView.register(CustomizeCellHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "headerID")
        masterCollectionView.register(CustomizeCell.self, forCellWithReuseIdentifier: cvCellID)
        masterCollectionView.backgroundColor = UIColor.white
        masterCollectionView.allowsMultipleSelection = true
    }
}

extension MenuDetailVC {
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cvCellID, for: indexPath) as! CustomizeCell
        cell.customizable = masterCustomizables?[indexPath.section].choices?[indexPath.row]
        return cell
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        if let count = masterCustomizables?.count {
            return count
        } else {
            return 0
        }
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if let count = masterCustomizables?[section].choices?.count {
            return count
        } else {
            return 0
        }
    }

Класс MasterCustomize имеет переменную экземпляра .isRequired.это возвращает bool, и если .isRequired == true, раздел должен содержать отдельные ячейки выбора.В противном случае он должен содержать несколько ячеек выбора.Очевидно, что текущее состояние программы возвращает только несколько ячеек выбора.Спасибо!

1 Ответ

0 голосов
/ 27 июня 2019

In collectionView shouldSelectItemAt метод проверки .isRequired значение. Если это правда, проверьте количество выбранных ячеек в этом разделе. Если количество существующих выбранных ячеек равно 0, верните true.

Если значение .isRequired равно false, вернуть true

func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
    if (masterCustomizables ?? [])[indexPath.section].isRequired {
        return collectionView.indexPathsForSelectedItems?.filter { $0.section == indexPath.section }.count == 0
    } else {
        return true
    }
}

Обновление

Если isRequired истинно, отмените выделение уже выбранной ячейки программно.

func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
    if (masterCustomizables ?? [])[indexPath.section].isRequired,
        let existingSelectedIndex = collectionView.indexPathsForSelectedItems?.first(where: { $0.section == indexPath.section }) {
            collectionView.deselectItem(at: existingSelectedIndex, animated: true)
    }
    return true
}
...