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