You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 代理函数无返回值,didSelectRowAt中delegate为nil问题求助

问题根因

你通过Storyboard Segue触发跳转时,系统会自动创建一个全新的FontTableTableViewController(VC-B)实例,而你在VC-A中手动初始化的fontTable实例和跳转使用的实例是两个完全独立的对象,你仅给手动创建的实例设置了delegate,跳转时用到的VC-B实例的delegate未被赋值,因此为nil导致传值失效。

修复方案
  • 第一步:删除VC-A中无效的手动初始化逻辑,清理后VC-A代码如下:
class ViewController: UIViewController, FontDelegate {
    @IBOutlet weak var infoLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    func getFontName(data: String) {
        infoLabel.text = data
    }
}
  • 第二步:在VC-A中重写prepare(for:sender:)方法,在Segue触发时拿到跳转目标VC-B实例,为其设置delegate。首先你需要先在Storyboard中给当前的Popover Segue设置唯一标识(比如命名为fontSelectSegue),然后添加如下代码:
// 追加到ViewController类中
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 这里替换为你自己在Storyboard中设置的Segue标识
    if segue.identifier == "fontSelectSegue" {
        guard let fontTableVC = segue.destination as? FontTableTableViewController else { return }
        fontTableVC.delegate = self
    }
}
  • 第三步(可选优化):为避免循环引用风险,给协议添加类约束,并将代理属性修饰为weak,修改VC-B代码如下:
// 协议添加AnyObject约束,表示仅允许类遵守
protocol FontDelegate: AnyObject {
    func getFontName(data: String)
}
    
class FontTableTableViewController: UITableViewController {
    let fontArray = ["Helvetica", "Arial", "Monaco"]
    // 代理属性加weak修饰
    weak var delegate: FontDelegate?

    // 其余原有代码保持不变
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let font = fontArray[indexPath.row]
        self.delegate?.getFontName(data: font)
        self.dismiss(animated: true, completion: nil)
    }
}

内容的提问来源于stack exchange,提问作者squarehippo10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:48:05