添加观察在 Swift 4 中不起作用

Posted

技术标签:

【中文标题】添加观察在 Swift 4 中不起作用【英文标题】:Add observe isn't working in Swift 4 【发布时间】:2017-10-02 13:12:47 【问题描述】:

当我在查看如何从另一个视图中调用函数时,我发现 NotificationCenter 是一个很好的解决方案,所以我尝试像这样使用它:

在我想调用函数的主视图(ViewController)中,我放了这个:

NotificationCenter.default.addObserver(
            self,
            selector: #selector(ViewController.loyalty),
            name: NSNotification.Name("loyalty"),
            object: nil)

在我调用 self.dismiss(animated: true, completion: nil) 之前的第二个视图中,我调用它来触发观察:

NotificationCenter.default.post(name: NSNotification.Name("loyalty"), object: nil)

最后在 swift 4 更新后,我的函数 loyaltyfunc 之前有 @objc,它是这样的:

@objc func loyalty()

PS 我也试过 NSNotification.Name(rawValue: "loyalty")

也许我忘了做某事?

提前致谢!

编辑:

在我忘记删除一些数组之后,该函数正在执行,这就是我认为它不起作用的原因。

【问题讨论】:

也许你正在删除viewWillDisappear中的观察者。 @the4kman 感谢您的评论,但我没有删除它(我检查确定) 您是否要在代码中的其他位置删除观察者? @the4kman 不,我用 cmd+f 搜索它以确保 @the4kman 该函数毕竟正在执行,但我忘记擦除我的数组以获得正确的结果。 (我在函数开始时通过打印发现了它)。很抱歉浪费您的时间... 【参考方案1】:

苹果文档说:

在 OS X 10.11 和 ios 9.0 中,NSNotificationCenter 和 NSDistributedNotificationCenter 将不再向可能被释放的已注册观察者发送通知。

所以我认为您的控制器在收到通知之前在dismiss 之后被释放。

【讨论】:

也感谢您的回答和很好的信息!该函数毕竟正在执行,但我忘记擦除我的数组以获得正确的结果。 (我在函数开始时通过打印发现了它)。很抱歉浪费您的时间...【参考方案2】:

我认为该函数应该有一个要调用的参数。

尝试将您的函数编辑为:

@objc func loyalty(_ notification : NSNotification)

而选择器变成#selector(ViewController.loyalty(_:)

注意:register/post 都应该在同一个 Thread 中调用

【讨论】:

也感谢您的回答和很好的信息!该函数毕竟正在执行,但我忘记擦除我的数组以获得正确的结果。 (我在函数开始时通过打印发现了它)。很抱歉浪费您的时间...

以上是关于添加观察在 Swift 4 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 的 Swift addTarget 在 UIView 中不起作用

CoreLocation requestWhenInUseAuthorization() 在 Swift 中不起作用

为啥两个表格视图单元格中的两个集合视图在 Swift 4 中不起作用?

UIDevice 在 swift 2.0 中不起作用

滑动删除 UITableView 单元格动画在 swift 2 中不起作用

Swift 自动布局在 Xcode 9.3 中不起作用