Поскольку значение UITableviewCell превышает 10, и если я нажимаю на верхнюю часть кнопки, она автоматически нажимает последнюю из кнопок UITableViewCell.любая идея? - PullRequest
0 голосов
/ 02 декабря 2018

В моем UITableViewCell есть кнопка AddToCart кнопки.Как будто мои UITableView данные больше, чем 10 означает, что мне нужно прокрутить, чтобы увидеть все данные.Так что теперь, если я нажму первую кнопку первой UITableViewCell при прокрутке вниз, чтобы увидеть все записи таблицы, чем автоматически нажмет последнюю или вторая последняя кнопка, я не смогу найти проблему, почему это происходит

Я впервые реализую этот тип функциональности, поэтому застрял, чтобы решить проблему

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 13
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "tblCell") as! ProductTableViewCell
    cell.btnAddToCart.tag = indexPath.row
    cell.btnAddToCart.addTarget(self, action: #selector(addToCartDell(sender:)), for: .touchUpInside)
    return cell
}   

Эта функция используется для скрытия и отображения опции кнопки «Добавить в корзину».

@objc func addToCartDell(sender: UIButton) {
    let tagVal = sender.tag
    let indexPath = IndexPath(item: tagVal, section: 0)
    if let cell = tblProduct.cellForRow(at: indexPath) as? ProductTableViewCell {
        cell.btnAddToCart.isHidden = true
    }
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Клетки используются повторно.Вы не сохраняете скрытое состояние ячейки, поэтому при повторном использовании ячейки сохраняется последнее состояние.

В Swift наиболее эффективным и надежным решением является сохранение состояния , добавленного в корзину в модели данных и используйте закрытие обратного вызова для обновления пользовательского интерфейса в cellForRow.

В модели данных добавьте свойство addedToCart, предполагается, что в качестве модели данных используется пользовательская структура или класс

var addedToCart = false

В ProductTableViewCell добавить переменную обратного вызова и IBAction.Подключите IBAction к кнопке

var callback : (()->())?

@IBAction func buttonPressed(_ sender : UIButton) {
   callback?()
}

В контроллере в cellForRow обработайте обратный вызов, products представляет массив источника данных

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "tblCell") as! ProductTableViewCell
    let product = products[indexPath.row]
    cell.btnAddToCart.isHidden = product.addedToCart
    cell.callback = {
        product.addedToCart = true
        cell.btnAddToCart.isHidden = true
    }
    return cell
}  

Нет тегов, нет цели / действия, без протоколов, без дополнительной работы в willDisplayCell.

0 голосов
/ 02 декабря 2018

Эта проблема возникает, потому что мы повторно используем ту же ячейку для отображения любых дальнейших строк, которые еще не были видны.

Вы можете реализовать этот метод для исправления отображения любых других ячеек

optional func tableView(_ tableView: UITableView, 
            willDisplay cell: UITableViewCell, 
               forRowAt indexPath: IndexPath) 

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

Если мы углубимся в реализацию.Должна существовать модель, которая сохраняет состояние addedToCart в этой модели на основе кнопки, нажатой в определенной строке, и использует addedToCart (model.addedToCart) этой же модели, чтобы показать скрытие кнопки в методе делегата.

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