2015-03-31 49 views
4

我对自定义初始化器的概念有些陌生,所以我很难理解如果我试图做什么是可能的。通过故事板传递自定义初始化参数在Swift中陷入

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

,因为它在源代码中实现初始化是这样的:

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,将该类设置为原始代码,即将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

变化init代码如下

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

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

init(coder:)被调用。在你的情况下,覆盖被调用,你写了一个fatalError()使它失败,执行时得到的错误。

+0

看来我得到这个错误:'属性self.chat未初始化super.init调用' – YichenBman 2015-03-31 19:29:30

1

的问题是不是因为你没有初始化聊天参数,这是因为你没有在initWithCoder中调用super。这就是要求从故事板出来的视图的方法,因此您只需设置聊天属性而不是使用自定义初始化程序,就像在最后一个代码片段中显示的那样。既然你没有在int方法中做任何事情,你可以将它们全部删除。如果你需要让它们出于某种其他目的,那么只需从initWithCoder中删除“致命错误”行,并将其替换为super的调用。每当经由Storyboard创建UIViewController

相关问题