我对自定义初始化程序的概念有点新,所以我很难理解我想做的事情是否可行。
我正在使用源代码来创建消息传递应用。所有的代码都是在没有使用故事板的情况下编写的,我现在想要实现它。
在源代码中实现的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)
答案 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()
以使其失败,这是您在执行时遇到的错误。