2017-06-29 54 views
0

我有一個擴展UINavigationController類。從UINavigationController的繼承斯威夫特

class MyNavigationController: UINavigationController { 
    var reservationId: Int 
    var blankViewController: BlankViewController 

    init(clientId aClientId: Int, reservationId aReservationId: Int) { 

     blankViewController = BlankViewController() 

     clientId = aClientId 
     reservationId = aReservationId 

     super.init(rootViewController: blankViewController) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

這是書中的事情。我指定的初始化器正在調用超類指定的初始化器。但是,在運行時應用程序崩潰與此消息:

fatal error: use of unimplemented initializer 
'init(nibName:bundle:)' for class 'MyiOSApp.MyNavigationController' 

經過反覆試驗,我做的問題,通過這樣做,而不是消失。

init(clientId aClientId: Int, reservationId aReservationId: Int) { 

    blankViewController = BlankViewController() 

    clientId = aClientId 
    reservationId = aReservationId 

    super.init(nibName: nil, bundle: nil) 
} 

但是init(nibName: nil, bundle: nil)不是直接超類的指定初始值設定項。從技術上講,這不應該編譯。所以我非常困惑。第一個代碼違反了什麼具體規則?如果我確實打破了一些規則,爲什麼編譯器不抓住它呢?

一個可能的解釋是,init(nibName:, bundle:)是必需的初始化。但是這個解釋有問題。從我所看到的init(nibName:, bundle:)init(rootViewController:)init?(coder:)如文檔或在Xcode源代碼視圖中所需的有關。出於某種原因,編譯器認爲init?(coder:)是必需的,但對於其他init方法則不這樣。所有這些都很奇怪。

編輯:很多你的答案張貼說如何得到這個工作的。我的問題不在於此。我已經可以像這樣在我的問題中注意到了這一點。我的問題是關於Swift初始化規則,以及我可能違反的規則。

+0

@ Paulw11崩潰是不是在''的init(編碼器)''。請參閱崩潰錯誤消息。謝謝。 – RajV

+3

您沒有實現其他所需的初始化程序 - init(nibName,bundle) - 這是['UIViewController'](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621359-init)所需的 – Paulw11

回答

0

當初始化從故事板則需要執行

required init?(coder aDecoder: NSCoder) {}

,當你intialize控制器手動分配和intialize任何控制器,你必須用包名一起告訴筆尖文件名的名稱。爲參考。

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
     print("init nibName style") 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    } 

這是很好的做法,這個init方法

convenience init() { 
    self.init() 
} 
+0

' 'init(nibName:,bundle:)''未被標記爲必需。編譯器也不這麼認爲。 – RajV

0

你的子類,如果重寫init(nibName:,bundle:)以及將工作。

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
} 

您還必須爲您的屬性提供默認值。

+0

我的問題不是關於如何以某種方式得到這個工作。這是關於Swift初始化規則以及我可能打破的具體規則。 'init(nibName:,bundle:)''不被標記爲必需的。編譯器也不這麼認爲。那麼爲什麼我必須執行它? – RajV