iOS - UITableViewCell, UIAlertController

Добрый день всем. Столкнулся с проблемой. Мне нужно составить таблицу с кнопкой и, нажав на кнопку, я получу оповещение с номером ячейки. Сами ячейки таблицы не активны. Вот как я это понял. Когда я прокручиваю таблицу в начале, все в порядке, когда вы нажимаете кнопку, отображается предупреждение с правильным номером строки, но после 4 элементов появляется ошибка.

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

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

    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as UITableViewCell

    if (tableView.tag == 1) {
        let numLabel: UILabel = tableView.viewWithTag(3) as! UILabel
        numLabel.text = String(indexPath.row)
    } else if (tableView.tag == 2) {

        //Error appears here
        let numButton: UIButton = tableView.viewWithTag(4) as! UIButton 
        numButton.setTitle(String(indexPath.row), for: .normal)

        numButton.tag = indexPath.row
    }

    return cell
}

@IBAction func showAlertForRow(row: UIButton) {
    let alert = UIAlertController(title:"Test work",message:"Cell at row \(row.tag) was tapped!",preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Okay", style: UIAlertActionStyle.default, handler: nil))
    self.present(alert, animated: true, completion: nil)
}

1 ответ

Решение

То, что вы разрабатываете для реализации этой процедуры, не правильно. Что ты можешь сделать

  1. Сделайте собственную ячейку
  2. Добавить кнопку в пользовательскую ячейку
  3. Добавить действие в этой кнопке в CellForRowAtIndexPath
  4. Обработайте действие из ViewController, где вы добавили tableView.

Я сделал целый проект для вас. Просто чтобы вы знали. если вы хотите добавить customCell в tableView, вам нужно зарегистрировать его в viewDidLoad следующим образом. Я сделал это в файле ViewController.swift. зацени мой проект

let nib = UINib.init(nibName:String(describing: sampleTableViewCell.self) , bundle: nil)
tableView.register(nib, forCellReuseIdentifier: "chatCell")

Затем проверьте функцию cellForRowAtIndexPath:

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "chatCell", for: indexPath) as! sampleTableViewCell

    cell.clickMeBtn.tag = indexPath.row
    cell.clickMeBtn.addTarget(self, action: #selector(onButtonPressed(sender :)), for: .touchUpInside)
    return cell

}

Функция нажатия кнопки:

func onButtonPressed(sender:UIButton) {
    let alert = UIAlertController.init(title:"Cell index is"+String(sender.tag), message: nil, preferredStyle: UIAlertControllerStyle.alert)
    let okAction = UIAlertAction.init(title: "ok", style: UIAlertActionStyle.default) { (UIAlertAction) in

    }

    alert.addAction(okAction)
    self.present(alert, animated: true, completion: nil)


}

Проверьте только три файла:

Github ссылка

  1. ViewController.swift

  2. sampleTableViewCell.swift

  3. sampleTableViewCell.xib **

Вот вывод:

Другие вопросы по тегам