在 Swift 中通过 Storyboard Segue 传递自定义初始化参数

Pass Custom Init Parameter through Storyboard Segue in Swift

我对自定义初始化程序的概念有些陌生,所以我很难理解我尝试做的事情是否可行。

我正在使用源代码创建消息应用程序。所有代码都是在不使用故事板的情况下编写的,我现在想实现它。

源代码中实现的init是这样的:

init(chat: Chat) {
    self.chat = chat
    super.init(nibName: nil, bundle: nil)
    title = chat.user.name
}

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

didSelectRowAtIndexPath方法中,原来的代码是这样传递一个自定义初始化参数的:

 let chat = chats[indexPath.row]
    let chatViewController = MessagesViewController(chat: chat)
    navigationController?.pushViewController(chatViewController, animated: true)

我尝试做的只是创建一个故事板 UIViewController,将 class 设置为原始代码,即将故事板 ViewController 设置为:消息ViewController,然后执行 segue。像这样:

if segue.identifier == "ToMessages" {
        var messagesViewController: MessagesViewController = segue.destinationViewController as MessagesViewController
        let chat = chats[indexPath.row]
        messagesViewController.chat = chat
    }

然后performSegueWithIdentifier("ToMessages", sender: self)

当我这样做时,我得到了这个致命错误:fatal error: init(coder:) has not been implemented:

根据我对原始源代码的研究和理解,原因是我没有初始化chat参数。我意识到我可能不在正确的轨道上,如果是的话,我将不胜感激。

如果我对发生的事情是正确的,那么我的具体问题是如何在 prepareForSegue 方法中实现参数,例如:

var destinationVC = segue.destinationViewController as MessagesViewController(chat: chat)

问题不是因为你没有初始化聊天参数,而是因为你没有在 initWithCoder 中调用 super。这是为故事板中的视图调用的方法,因此您只需设置聊天 属性 而不是使用自定义初始化程序,就像您在上一个代码片段中显示的那样。由于您没有在 int 方法中执行任何操作,因此您可以将它们全部删除。如果出于其他目的需要将它们放在那里,则只需从 initWithCoder 中删除 "fatal error" 行,并将其替换为对 super 的调用。

修改init代码如下

init(chat: Chat) {
    self.chat = chat
    super.init()
    title = chat.user.name
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
只要通过 Storyboard 创建 UIViewController,就会调用

init(coder:)。在您的情况下,调用了覆盖,您在其中编写了 fatalError() 使其失败,这是执行时遇到的错误。