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

为什么NotificationCenter中TViewController观察者无法接收通知?

问题原因

  • 你在ViewController的viewDidLoad方法中创建的TViewController实例是局部临时变量,方法执行结束后该实例就会被系统释放,它注册的通知观察者也会随之失效,自然无法响应通知。
  • 你通过segue从SViewController跳转到TViewController时生成的是全新的另一个TViewController实例,你点击按钮发送通知的时候,这个新实例还没有完成初始化和观察者注册,不可能接收到发送时间早于它注册时间的通知。

解决方案

方案1:调整实例生命周期

将你在ViewController中创建的TViewController实例改为全局属性持有,避免被提前释放,发通知时该实例就能正常接收通知:

class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!
    // 改为全局属性持有,避免实例被释放
    var tvc: TViewController!

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(fhandle(notification:)), name: .fnote, object: nil)
        
        let storyboad = UIStoryboard(name: "Main", bundle: nil)
        tvc = storyboad.instantiateViewController(identifier: "1") as! TViewController
        let _ = tvc.view
    }
    // 其余代码保持不变
}

后续跳转时直接使用这个已持有的TViewController实例跳转,不要用segue自动创建新实例,就能拿到通知更新后的值。

方案2:直接传值替代提前注册

如果你的需求是跳转后展示通知携带的内容,不需要跳转前响应通知,就不需要提前注册观察者:

  1. 点击按钮发送通知时直接把要传递的值存入你定义的全局变量temp
  2. TViewController的viewDidLoad方法中直接读取temp的值赋值给UI即可,不需要等待通知回调。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:45:05