2015-03-31 47 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

相關問題