Как я могу ограничить выбираемые ячейки в UICollectionView - PullRequest
0 голосов
/ 05 октября 2018

В моем приложении у меня есть UICollectionView с 12 х 4 квадратов.Я хочу, чтобы пользователь мог выбрать только 4 из них в одном цикле.Как я могу заблокировать другие строки?Я прочитал что-то о заголовках в UITableView, но это не сработало в UICollectionView

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Определите следующие переменные:

var firstSelectedIndex: Int?
var nextEligibleCount: Int = 0

Затем обновите метод делегата collectionView:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    switch indexPath.row {
    case 0, 4, 8, 12:
        firstSelectedIndex = indexPath.row
        print("-----New row click has been started------")
        print(String(indexPath.row) + " is clicked")
        nextEligibleCount = 1
    default:
        checkClick(atIndex: indexPath.row)
    }
}

checkClick () определяется какниже:

func checkClick(atIndex selectedIndex: Int) {
    if firstSelectedIndex != nil {
        if selectedIndex == firstSelectedIndex! + nextEligibleCount {
            print(String(selectedIndex) + " is clicked")
            nextEligibleCount = nextEligibleCount + 1
        } else {
            print("Invalid click")
        }
    }
}
0 голосов
/ 05 октября 2018

Попробуйте это решение:

var firstIndex = -1
var lastIndex = -1
var arraySelectedIndexes = [Int]()
var setEligibleIndexesForSelection = Set<Int>()

let numerOfItems = 20

Я попытался рассмотреть все сценарии:

extension ViewController : UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
        switch (self.setEligibleIndexesForSelection.contains(indexPath.row), self.arraySelectedIndexes.count == 0) {
        case (false,false):
            return false
        default:
            return true
        }
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        self.arraySelectedIndexes.append(indexPath.row)
        self.arraySelectedIndexes.sort()

        let cell = collectionView.cellForItem(at: indexPath)
        cell?.backgroundColor = UIColor.lightGray

        self.firstIndex = self.arraySelectedIndexes[0]
        self.lastIndex = self.arraySelectedIndexes[self.arraySelectedIndexes.count - 1]

        self.updateEligibleIndexArray()
    }

    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        let indexOfSelectedData = self.arraySelectedIndexes.firstIndex(of: indexPath.row)
    self.arraySelectedIndexes.remove(at: indexOfSelectedData!)

        if self.arraySelectedIndexes.count > 0 {
            self.firstIndex = self.arraySelectedIndexes[0]
            self.lastIndex = self.arraySelectedIndexes[self.arraySelectedIndexes.count - 1]
            self.updateEligibleIndexArray()
        }
        else {
            self.firstIndex = -1
            self.lastIndex = -1
            self.setEligibleIndexesForSelection.removeAll()
        }

        let cell = collectionView.cellForItem(at: indexPath)
        cell?.backgroundColor = UIColor.white

    }

    func updateEligibleIndexArray() {
        self.setEligibleIndexesForSelection.removeAll()

        for i in self.firstIndex..<self.firstIndex+4 {
            if i < self.numerOfItems && !self.arraySelectedIndexes.contains(i) {
                self.setEligibleIndexesForSelection.insert(i)
            }
        }

        for i in self.lastIndex-3..<self.lastIndex {
            if i >= 0 && !self.arraySelectedIndexes.contains(i) {
                self.setEligibleIndexesForSelection.insert(i)
            }
        }
    }
}

Возможно, я пропустил несколько сценариев, поэтому дайте мне знать, сработало ли это или нет.

0 голосов
/ 05 октября 2018

Реализация нижеуказанного UICollectionViewDelegate

func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
    return collectionView.indexPathsForSelectedItems?.count <=  4
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...