изменить объекты только одной ячейки коллекции - PullRequest
0 голосов
/ 28 апреля 2018

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

Это код, который я написал:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
   let cell : CollectionViewCellKharid3 = collectionView.dequeueReusableCell(withReuseIdentifier: "customcell3", for: indexPath) as! CollectionViewCellKharid3

        cell.lblEsmeMahsul.text = mainCats[indexPath.row]

        cell.imgMahsul.af_setImage(withURL: URL(string : (mainadress + "/Opitures/" + mainPicNumbers[indexPath.row]))!, placeholderImage: UIImage(named: "loadings" ))


        cell.btnKharid.addTarget(self, action: #selector(btnColectionviewCellTapped), for : UIControlEvents.touchUpInside)
        cell.btnKharid.tag = indexPath.row

         cell.btnMosbat.addTarget(self, action: #selector(btnMosbatTapped), for : UIControlEvents.touchUpInside)
        cell.btnMosbat.tag = indexPath.row


        cell.configureCell()
        return cell
    }

@objc func btnColectionviewCellTapped(_ sender:UIButton){
    // let indexPath : IndexPath = self.collectionview1.ind

    print(sender.tag)

    sender.isHidden = true
}

@objc func btnMosbatTapped(_ sender:UIButton){
    let index = IndexPath(item: sender.tag , section: 0)
    let cell = self.collectionviewForushVije.cellForItem(at: index) as? CollectionViewCellKharid3

    cell?.lblTedad.text = "22"
    print(sender.tag)
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Это очень распространенное неправильное использование UICollectionView (или UITableView). Когда имеешь дело с ними, вы должны всегда помнить одну вещь, использовать повторно. Ячейка коллекции / табличного представления будет многократно использоваться ОС при необходимости. Причиной проблемы в вашем коде является то, что вы предполагаете, что одноразовый набор одного свойства в ячейке будет постоянным, что неверно. Ячейка, полученная из метода dequeue, всегда может быть новой или существующей ячейкой, поэтому любая конфигурация должна быть применена к ячейке, должна быть снова настроена. Подумайте так: все представления в ячейке «грязные», когда они получаются из представления коллекции, вы должны установить желаемое свойство, прежде чем возвращать его обратно (или иметь механизм для его установки позже). Поэтому, в вашем случае, просто устанавливайте свойство isHidden каждый раз, когда вы готовите ячейку в делегате cellForRow.

0 голосов
/ 28 апреля 2018

Клетки используются повторно. Вам нужно отслеживать, какие ячейки были нажаты, чтобы вы могли установить правильное состояние кнопки в вашем методе cellForItemAt.

Объявите свойство в вашем классе:

var beenTapped: Set<Int> = []

Затем в btnColectionviewCellTapped добавить:

beenTapped.insert(sender.tag)

А в cellForItemAt вам нужно:

cell.btnKharid.isHidden = beenTapped.contains(indexPath.item)

Вам также следует заменить использование indexPath.row на indexPath.item. row для табличных представлений. item предназначен для просмотра коллекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...