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 ответ
То, что вы разрабатываете для реализации этой процедуры, не правильно. Что ты можешь сделать
- Сделайте собственную ячейку
- Добавить кнопку в пользовательскую ячейку
- Добавить действие в этой кнопке в CellForRowAtIndexPath
- Обработайте действие из 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)
}
Проверьте только три файла:
ViewController.swift
sampleTableViewCell.swift
sampleTableViewCell.xib **
Вот вывод: