Swift技术问题:TableView模态跳转后Protocol Delegate不生效
解决模态视图选中单元格后更新原视图按钮文本的问题
嘿,作为Swift初学者碰到这种委托失效的情况太常见啦,咱先揪出问题根源,再一步步解决~
核心问题:委托对象(delegate)未被正确赋值
你写的委托协议和方法逻辑都是对的,但视图控制器2(DashboardModalViewController)的delegate属性默认是nil,所以当你调用delegate?.didSelectValue(value: rowTitle)时,这个方法根本没被触发(可选链调用在nil时会直接跳过)。
具体解决步骤
1. 在视图控制器1中设置委托对象
因为你是通过Storyboard的模态segue跳转,所以需要在ChartsViewController的prepare(for:sender:)方法里,给即将弹出的DashboardModalViewController实例赋值delegate:
class ChartsViewController: UIViewController { @IBOutlet weak var titleButton: UIButton! // 如果你是通过按钮点击触发segue,记得给按钮关联这个IBAction(直接用Storyboard的segue触发也可以) @IBAction func openModalTapped(_ sender: UIButton) { performSegue(withIdentifier: "ShowDashboardModal", sender: self) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 先判断segue的目标控制器是不是我们要的模态视图控制器 guard let modalVC = segue.destination as? DashboardModalViewController else { return } // 关键!把当前视图控制器设为模态视图的委托 modalVC.delegate = self } } extension ChartsViewController: ModalDelegate { func didSelectValue(value: String) { self.titleButton.setTitle(value, for: .normal) // 可以加个打印验证方法是否被调用 print("委托方法触发,按钮文本更新为:\(value)") } }
2. (可选但推荐)给委托属性加上weak修饰符
为了避免循环引用(模态视图控制器被原视图控制器强引用,原视图又被模态视图的委托强引用),给DashboardModalViewController的delegate属性加上weak关键字(因为你的协议已经标记为class类型,支持弱引用):
protocol ModalDelegate: class { func didSelectValue(value: String) } class DashboardModalViewController: UIViewController { // 加上weak修饰符 weak var delegate: ModalDelegate? }
3. 额外检查点
- 确保Storyboard里的segue是从
ChartsViewController的按钮(或者视图控制器本身)连接到DashboardModalViewController的,且如果用了performSegue(withIdentifier:),要给segue设置对应的identifier(比如ShowDashboardModal)。 - 确认
DashboardModalViewController中的rows数组已经正确初始化,rowTitle能拿到有效值(你已经加了print(rowTitle),可以看控制台是否输出正确内容)。
这样修改后,当你选中模态视图的TableView行时,委托方法就会被触发,原视图的按钮文本也就会更新啦~
内容的提问来源于stack exchange,提问作者user3628240
相关产品推荐
相关产品推荐

