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

时间:2015-03-31 18:23:53

标签: ios swift initialization segue

我对自定义初始化程序的概念有点新,所以我很难理解我想做的事情是否可行。

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

在源代码中实现的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方法中,原始代码以这种方式传递了自定义init参数:

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

我尝试做的只是创建一个故事板UIViewController,将类设置为原始代码,即将storyboard ViewController设置为:MessagesViewController,然后执行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)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

更改init代码如下

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

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
只要通过init(coder:)创建UIViewController,就会调用{p> Storyboard。在您的情况下,调用覆盖,您在其中编写了fatalError()以使其失败,这是您在执行时遇到的错误。