即使它在主viewcontroller中设置,也有委托nil错误

时间:2017-09-10 17:18:29

标签: swift delegates protocols

我有一个简单的应用程序,welcomeVC显示一个带有人名的问候消息。在另一个VC nameVC中,用户可以更改他们想要调用的名称,并且当他们点击返回时,它假设更新welcomeVC上的名称。

为了将名称从nameVC传递回welcomeVC,我在nameVC中设置了一个协议ChangeNameDelegate,并在我的类中创建了一个变量:

protocol ChangeNameDelegate {
    func updateName(name: String)
}
class nameViewController: UIViewController {
    @IBOutlet weak var nameTextField: UITextField!
    var changeNameDelegate: ChangeNameDelegate!
    override func viewDidLoad() {

    }

    @IBAction func closeNameVC(_ sender: UIButton) {
        if let newName = nameTextField.text {
            changeNameDelegate.updateName(name: newName)
        }

        dismiss(animated: true, completion: nil)
    }

}

在我的welcomeVC中,我确保通过设置如下来注册委托并符合协议:

class welcomeViewController: UIViewController, UIViewControllerTransitioningDelegate {
let nameVC = nameViewController()
override func viewDidLoad() {
       nameVC.changeNameDelegate = self
    }
}
extension welcomeViewController: ChangeNameDelegate {
    func updateName(name: String) {
        print("The name has been updated!")
        nameLabel.text = name
    }

}

然而,当我运行我的应用程序时,它发生了崩溃,因为changeNameDelegate似乎是零。有人知道那里可能会错过什么吗?提前致谢!

2 个答案:

答案 0 :(得分:0)

从WelcomeViewController进行路由时,您似乎正在实例化NameViewController的 new 实例。您应该导航到之前实例化的nameVC。

答案 1 :(得分:-1)

我后来通过使用notification / observer解决了这个问题。

在父视图中:

    let userUpdateNotification = Notification.Name(rawValue: "nameNotificationKey")
 NotificationCenter.default.addObserver(self, selector:  #selector(updateUser), name: userUpdateNotification, object: nil)
    }

func updateUser(not: NSNotification) {
    if let userInfo = not.userInfo {
        if let userName = userInfo["name"] as? String {
            nameLabel.text = userName
        }
    }
}

在子视图中:

   let name = Notification.Name(rawValue: "nameNotificationKey")
            NotificationCenter.default.post(name: name , object: self, userInfo: ["name": nameTextField.text!] )
        }

我不知道委托/协议是否在未连接的视图控制器之间不起作用。任何了解此事的人都欢迎发表评论!