为什么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:直接传值替代提前注册
如果你的需求是跳转后展示通知携带的内容,不需要跳转前响应通知,就不需要提前注册观察者:
- 点击按钮发送通知时直接把要传递的值存入你定义的全局变量
temp TViewController的viewDidLoad方法中直接读取temp的值赋值给UI即可,不需要等待通知回调。
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

