自定义Cell中通过按钮执行Segue并传递Medicine对象问题求助
解决静态表格视图编辑按钮无法传递Medicine对象的问题
别担心,这种小问题在iOS开发里太常见了,咱们一步步排查修复,很快就能搞定!
先揪出代码里的语法错误
你的代码里有几个拼写和语法问题,这可能是导致崩溃的直接原因:
@IBAction的参数名写错了:_sender应该是_ sender(下划线加空格)或者直接sender,不然你后面用sender会报未定义的错误convert方法的语法错误:正确写法是sender.convert(CGPoint.zero, to: self.tableView),你少了逗号和冒号preformSegue拼写错误:应该是performSegue(是perform不是preform)
解决强制解包导致的崩溃
你用(buttonIndexPath?.row)!这种强制解包的方式,一旦buttonIndexPath为nil(比如按钮位置没对应到tableView的行),App立刻就会崩溃。咱们换更安全的写法,而且没必要用全局的buttonIndexPath存储,直接把Medicine对象作为sender传递更可靠。
修正后的完整代码
编辑按钮的点击事件
@IBAction func editButtonTapped(_ sender: UIButton) { // 将按钮的坐标转换为tableView的坐标 let point = sender.convert(CGPoint.zero, to: self.tableView) // 安全获取对应的indexPath,避免nil崩溃 guard let indexPath = tableView.indexPathForRow(at: point) else { print("无法找到对应的药品行") return } // 获取对应的Medicine对象,直接作为sender传递给segue let targetMedicine = medicines[indexPath.row] performSegue(withIdentifier: "showDetails", sender: targetMedicine) }
prepare方法的修正
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showDetails" { // 安全转换目标控制器和sender对象 guard let detailVC = segue.destination as? MedicineDetailTableViewController, let selectedMedicine = sender as? Medicine else { print("无法正确获取目标控制器或药品对象") return } // 传递Medicine对象 detailVC.medicine = selectedMedicine } }
额外小建议
- 尽量避免使用
!强制解包,多用guard let或if let做可选绑定,这是iOS开发中避免崩溃的核心技巧之一 - 如果你的按钮是放在自定义TableViewCell里的,还可以考虑给按钮添加一个关联的Medicine对象属性,或者在cell初始化时绑定indexPath,不过当前通过坐标获取indexPath的方式已经足够好用啦
内容的提问来源于stack exchange,提问作者James Frost
相关产品推荐
相关产品推荐

