Ios 嵌入式视图控制器(Swift 3)中从未调用addObserver选择器函数
我用主Ios 嵌入式视图控制器(Swift 3)中从未调用addObserver选择器函数,ios,swift,swift3,uiviewcontroller,Ios,Swift,Swift3,Uiviewcontroller,我用主ViewController和嵌入辅助ViewController的NavigationController设置了故事板。主ViewController和NavigationController与一个按按钮触发的显示序列相连。随附的照片显示了我的故事板 单击按钮时,LabelViewController中的标签应更改,显示序列应触发并显示NavigationViewController(嵌入LabelViewController)。后半部分工作正常,并显示NavigationViewCo
ViewController
和嵌入辅助ViewController
的NavigationController
设置了故事板。主ViewController
和NavigationController
与一个按按钮触发的显示序列相连。随附的照片显示了我的故事板
单击按钮时,LabelViewController
中的标签应更改,显示序列应触发并显示NavigationViewController
(嵌入LabelViewController
)。后半部分工作正常,并显示NavigationViewController
,但标签的值从未更改
要更改标签的值,我正在使用NotificationCenter
的addObserver
和post
。虽然还有其他方法,但我需要使用NotificationCenter
传递数据(userData
)
代码
在第一个ViewController
中,我在按下按钮时触发的iAction
中有一行代码
NotificationCenter.default.post(名称:NSNotification.name(原始值:“changeLabelValue”),对象:nil,用户信息:[“labelValue”:“Changed value”])
然后,在LabelViewController
的viewDidLoad
中,我为观察者准备了另一行代码
NotificationCenter.default.addObserver(self,selector:#selector(changeLabelValue(:)),name:NSNotification.name(rawValue:“changeLabelValue”),object:nil)
选择器函数,changeLabelValue
如下所示
func changeLabelValue(_ notification: NSNotification) {
label.text = notification.userInfo?["value"] as? String
}
问题
如上所述,show segue会触发,我会看到
NavigationViewController
,但选择器功能(changeLabelValue
)LabelViewController的内部
永远不会被调用。您的函数永远不会被调用,因为它只会在第二个视图控制器的viewDidLoad
中被拒绝接收函数调用。但是,当您在第一个视图控制器中按下按钮时,第二个视图控制器尚未加载
要正确传递数据,需要使用prepareforsgue
。因此,在第一个视图控制器中,需要首先检查序列目标是否为UINavigationController
,因为第二个视图控制器嵌入其中。如果是,请检查导航控制器的topViewController
是否为您的SecondViewController
。如果两者都为真,则传递数据,数据将在SecondViewController
的viewDidLoad
部分中可用。示例代码:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationViewController = segue.destination as? UINavigationController {
if let secondViewControoler = destinationViewController.topViewController as? SecondViewController {
secondViewControoler.yourProperty = self.yourLabel.text
}
}
}
更新 以下内容在Swift 3中无效。看看@Fangminning的答案
您需要将
@objc
添加到changelabvalue
函数中,因为观察者必须从Objective-NSC对象继承
@objc func changeLabelValue(_ notification: NSNotification) {
label.text = notification.userInfo?["value"] as? String
}
在迅捷3
NotificationCenter.defaul
不需要刚刚选中的前缀。谢谢