UITableView при нажатии кнопки и изменении ее изображения Swift 4 - PullRequest
0 голосов
/ 30 мая 2018

У меня проблема при нажатии кнопки в UITableView.

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

Две кнопки меняют свое изображениекогда я нажимаю одну кнопку.

В этом видео показана проблема:

Проблема с показанным видео

Это мой код для нажатия кнопки:

  @objc func btnAction(_ sender: UIButton) {

    let section = 0
    let row = sender.tag
    let indexPath = IndexPath(row: row, section: section)


    //let point = sender.convert(CGPoint.zero, to: servicestable as UIView)
   // let indexPath: IndexPath! = servicestable.indexPathForRow(at: point)
    let cell: ServicesCell = self.servicestable.cellForRow(at: indexPath) as! ServicesCell

        print(sender.tag)


    if  services[indexPath.row].choose == "0" {

        cell.check.setImage(UIImage(named: "Rectangle1"), for: .normal)

        services[indexPath.row].choose = "1"
      //  checkchoose.updateValue(1, forKey: indexPath.row)

        print("number: " + String(indexPath.row))

        chooseservicesw.updateValue("0", forKey: String(indexPath.row+1))


   //     servicestable.reloadData()

    }

  else  if services[indexPath.row].choose == "1" {

        cell.check.setImage(UIImage(named: "checkbox1"), for: .normal)



        services[indexPath.row].choose = "0"
      //  checkchoose.updateValue(0, forKey: indexPath.row)

        print("number: " + String(indexPath.row))

        chooseservicesw.removeValue(forKey: String(indexPath.row+1))


     //   servicestable.reloadData()

    } }

и это мой код для сотовой связи:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

     let cell:ServicesCell = servicestable.dequeueReusableCell(withIdentifier: "servicess", for: indexPath) as! ServicesCell




    cell.name.text = services[indexPath.row].name

    let photo = services[indexPath.row].icon

    let imgURL = MainUrl + photo! // or jpg
  //  cell.icon.setImageFromURl(stringImageUrl: imgURL)

    let url = URL(string: imgURL)
    cell.icon.kf.setImage(with: url)

 //   print(checkchoose[indexPath.row])

    print(services[indexPath.row].choose)



    cell.check.tag = indexPath.row


    cell.check.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)

    cell.checkpay.tag = indexPath.row


    cell.checkpay.addTarget(self, action: #selector(self.btnAction2(_:)), for: .touchUpInside)
    cell.price.addTarget(self, action: #selector(self.endedit(_:)), for: .editingDidEnd)
    cell.price.addTarget(self, action: #selector(self.endedit(_:)), for: .editingChanged)



    cell.selectionStyle = .none



    return cell


}

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

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

В свой ViewController или TableViewController добавьте массив, который handel выбрал модель selectedIndexPathServices Добавьте свой YourServiceModel

Пример

class TableViewController: UITableViewController {

    var selectedIndexPathServices :[YourServiceModel] = [YourServiceModel]()


    override func viewDidLoad() {
        super.viewDidLoad()
   }
}

В вашем btnAction

  @objc func btnAction(_ sender: UIButton) {
        guard let cell = sender.superview?.superview as? ServicesCell else { return}

        let indexPath = self.tableView.indexPath(for: cell)

        if selectedIndexPathServices.contains(services[indexPath.row]){
            selectedIndexPathServices.remove(at: indexPath.row)

        }else{
            selectedIndexPathServices.append(services[indexPath.row])
        }
    }

В вашей камере:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell:ServicesCell = servicestable.dequeueReusableCell(withIdentifier: "servicess", for: indexPath) as! ServicesCell


        cell.name.text = services[indexPath.row].name

        let photo = services[indexPath.row].icon

        let imgURL = MainUrl + photo! // or jpg
        //  cell.icon.setImageFromURl(stringImageUrl: imgURL)

        let url = URL(string: imgURL)
        cell.icon.kf.setImage(with: url)

        //   print(checkchoose[indexPath.row])



        if selectedIndexPathServices.contains(services[indexPath.row]){


            if  services[indexPath.row].choose == "0" {
                cell.check.setImage(UIImage(named: "Rectangle1"), for: .normal)
                services[indexPath.row].choose = "1"
                chooseservicesw.updateValue("0", forKey: String(indexPath.row+1))

            }

            else  if services[indexPath.row].choose == "1" {
                cell.check.setImage(UIImage(named: "checkbox1"), for: .normal)
                services[indexPath.row].choose = "0"
                chooseservicesw.removeValue(forKey: String(indexPath.row+1))
            }

        }

        cell.check.tag = indexPath.row


        cell.check.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)

        cell.checkpay.tag = indexPath.row

        cell.checkpay.addTarget(self, action: #selector(self.btnAction2(_:)), for: .touchUpInside)
        cell.price.addTarget(self, action: #selector(self.endedit(_:)), for: .editingDidEnd)
        cell.price.addTarget(self, action: #selector(self.endedit(_:)), for: .editingChanged)



        cell.selectionStyle = .none



        return cell


    }
0 голосов
/ 30 мая 2018

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

Решение: Вы должны сохранить флаг выбора для ваших ячеек в массиве источника данных (в вашем случае это services ).А в методе cellForRowAt вы должны установить или снять флажки в соответствии с сохраненными данными выбора.

Редактировать:

if  services[indexPath.row].choose == "0" {
    cell.check.setImage(UIImage(named: "Rectangle1"), for: .normal)
    services[indexPath.row].choose = "1"
    chooseservicesw.updateValue("0", forKey: String(indexPath.row+1))
} else  if services[indexPath.row].choose == "1" {
    cell.check.setImage(UIImage(named: "checkbox1"), for: .normal)
    services[indexPath.row].choose = "0"
    chooseservicesw.removeValue(forKey: String(indexPath.row+1))
}

Добавить эту часть вконец вашего метода cellForRowAt. * ​​1016 *

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