UICollectionView | Сотовый многоразовый - PullRequest
0 голосов
/ 19 марта 2019

ТАК, UICollectionView мне сейчас очень больно. Представьте, что у меня есть UIViewController, в котором есть UICollectionView. Ну, каждая ячейка CollectionView - это почти вся ширина UIViewController. И каждая ячейка содержит несколько кнопок и изображений. Когда я выбираю одну кнопку и пытаюсь заставить кнопку сохранять свое состояние, CollectionView повторно использует ячейку и, как бы, дублирует состояния ячейки в других ячейках. Однако, когда я пытаюсь поместить ячейки в массив и хочу проверить состояние ячеек в этом массиве, метод cellForItemAt перезаписывает эти ячейки. Я так растерялся. Пожалуйста помоги. Даже prepareForReuse в UICollectionViewCell не помогает. Вот некоторый код:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! AddressCollectionViewCell
    cell.shopAddressDetailLbl.text = ""
    cell.addressObj = addresses[indexPath.row]
    cell.configureCellForAddress(cell.addressObj)
    cell.cellTag = indexPath.row
    cell.cellDelegate = self
    if addressCells.contains(cell) == false {
        addressCells.append(cell)
    } else {
        if cell.isAddressConfirmed == true {
            cell.confirmAddress.setTitle("CONFIRMED", for: .normal)
            cell.confirmAddress.isEnabled = false
            cell.confirmAddress.backgroundColor
                = UIColor(red: 0, green: 100/255, blue: 0, alpha: 1)
            addressCells[indexPath.row] = cell
        }
    }
    return cell
}

extension AddressesCollectionViewController: AddressCollectionViewCellDelegate {
    func confirmBtnPressed(confirmAddressObj: Address, cell:AddressCollectionViewCell) {
        for cellTemp in addressCells {
            if cellTemp == cell && cellTemp.isAddressConfirmed == false {
                if let dele = addressCollectionViewDelegate {
                    cellTemp.isAddressConfirmed = true
                    dele.configureCellsAccordingToChanges(cell: cellTemp)
                }
            }
        }
    }
}

override func prepareForReuse() {
    super.prepareForReuse()

    cellTag = 0
    confirmAddress.setTitle("Confirm Address", for: .normal)
    confirmAddress.backgroundColor = APP_UNIVERSAL_COLOR
    confirmAddress.isEnabled = true
}

Любая помощь более чем ценится.

1 Ответ

0 голосов
/ 19 марта 2019

? @Vadian, @Абу Уль Хасан ?

Довольно гладко! Для тех, кто нуждается в помощи в этом отношении. Вадиан предложил в комментариях, что мне просто нужно обновить и контролировать мою модель, и это именно то, что я сделал. ТАК вот так:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! AddressCollectionViewCell
    cell.shopAddressDetailLbl.text = ""
    cell.addressObj = addresses[indexPath.row]
    cell.configureCellForAddress(cell.addressObj)
    cell.cellTag = indexPath.row
    cell.cellDelegate = self

    if addresses[indexPath.row].isConfirmed! == true {
        cell.confirmAddress.setTitle("CONFIRMED", for: .normal)
        cell.confirmAddress.isEnabled = false
        cell.confirmAddress.backgroundColor = UIColor(red: 0, green: 100/255, blue: 0, alpha: 1)
    } else {
        cell.confirmAddress.setTitle("Confirm Address", for: .normal)
        cell.confirmAddress.isEnabled = true
        cell.confirmAddress.backgroundColor = APP_UNIVERSAL_COLOR
    }
    return cell
}

extension AddressesCollectionViewController: AddressCollectionViewCellDelegate {
    func confirmBtnPressed(confirmAddressObj: Address, cell:AddressCollectionViewCell) {
        if confirmAddressObj.isConfirmed! == false {
            if let dele = addressCollectionViewDelegate {
                cell.isAddressConfirmed = true
                dele.configureCellsAccordingToChanges(cell: cell)
            }
        }
    }
}

И его ЖИВЫЙ: D

...