我有一个自定义的tableviewcell,当我点击按钮时我在单元格内有按钮,下一个viewcontroller没有显示内容,但如果我点击单元格然后点击按钮,下一个视图控制器显示正确的内容在这里是我的代码:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell
cell.label.text = numberArray[indexPath.row]
cell.button.tag = indexPath.row
cell.button.addTarget(self,action:#selector(TableViewController.someAction(sender:)),
for:.touchUpInside)
return cell
}
这是我的按钮操作:
func someAction(sender : UIButton){
self.performSegue(withIdentifier: "showDetail", sender: self)
}
这是我的segue函数:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
if let indexPath = tableView.indexPathForSelectedRow
{
(segue.destination as! ViewController).number = numberArray[indexPath.row]
}
}
}
答案 0 :(得分:4)
问题在于prepare(for:sender:)
现在,如果您直接点击按钮,则indexPath
正在使用indexPathForSelectedRow
,而未选择所需内容的单元格则会传递indexPath
带有performSegue(withIdentifier:sender:)
的单元格。
func someAction(sender: UIButton) {
let point = sender.superview?.convert(sender.center, to: self.tableView)
if let indexPath = self.tableView.indexPathForRow(at: point!) {
//pass indexPath as sender with performSegue
self.performSegue(withIdentifier: "showDetail", sender: indexPath)
}
}
现在prepare(for:sender:)
将sender
投放到indexPath
,你们一切顺利。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
if let indexPath = sender as? IndexPath
{
(segue.destination as! ViewController).number = numberArray[indexPath.row]
}
}
}
注意:如果您忽略使用tag
,那就太棒了。
答案 1 :(得分:0)
您必须使用自定义单元格并按照以下步骤操作:
答案 2 :(得分:0)
试试这个:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
(segue.destination as! ViewController).number = numberArray[sender.tag]
}
}