使用初始化器将数据从一个视图传递到另一个视图

问题描述 投票:0回答:1

我正在开发一个消息传递应用程序 atm 和 ChatView 屏幕,您可以在其中看到用户之间传递的消息线程,我想让我的用户能够访问他们正在与之通信的用户的个人资料。

要进入 ChatView 类,用户从列表用户中选择另一个用户来发送消息。一旦选择了该用户,就会在初始化用户的地方发生到 ChatView 的 segue。从该视图中,用户可以选择显示与他们聊天的人的姓名的导航标题,以查看他们的个人资料。为了将用户数据传递给下一个视图控制器,我这样做了:

// line inside another function setting up the navigation title
    let button =  UIButton(type: .custom)
            button.frame = CGRect(x: 0, y: 0, width: 100, height: 30)
            button.titleLabel?.textColor = .white
            button.setTitle(self.otherUser.name, for: .normal)
            button.addTarget(self, action: #selector(showUserProfile), for: .touchUpInside)
            navigationItem.titleView = button
    
    @objc func showUserProfile() {
            let viewUserProfile = ViewProfileViewController()
            viewUserProfile.user = self.otherUser
            navigationController?.pushViewController(viewUserProfile, animated: true)
        }

然而,当我尝试这个时,我得到这个错误:

(11db) Unexpectedly found nil while implicitly unwrapping an Optional value
,在用户配置文件页面上,应用程序关闭。我在这里做错了什么?

swift variables
1个回答
0
投票

您的

ViewProfileViewController
如何定义其观点?如果它使用故事板或 nibfile,则使用默认初始化程序加载它是行不通的。 (它的所有 IBOulet 都将为 nil,因为它没有加载它的视图。)

从故事板加载视图控制器的常用方法是使用字符串标识符调用故事板的 instantiate() 方法。

如果您的视图控制器在其

ViewProfileViewController()
方法中构建其视图层次结构,则调用
loadView()
的唯一方法。

—-

编辑

如果你的视图控制器是在故事板中定义的,你需要:

  1. 使用
    func instantiateViewController(withIdentifier identifier: String) -> UIViewController
  2. 实例化你的视图控制器
  3. 呈现视图控制器(模态地,通过推送到您的视图控制器堆栈,或任何合适的方式)
  4. 实现 UIViewCotroller 方法
    prepare(for:sender:)
    。在该方法中,将您需要传递的任何数据传递到目标视图控制器中。
© www.soinside.com 2019 - 2024. All rights reserved.