我有一个简单的应用程序,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似乎是零。有人知道那里可能会错过什么吗?提前致谢!
答案 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!] )
}
我不知道委托/协议是否在未连接的视图控制器之间不起作用。任何了解此事的人都欢迎发表评论!