Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 嵌入式视图控制器(Swift 3)中从未调用addObserver选择器函数_Ios_Swift_Swift3_Uiviewcontroller - Fatal编程技术网

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
不需要刚刚选中的前缀。谢谢