[英]Casting a viewController extracted from an UINavigationController in Swift
[英]Inheriting from UINavigationController in Swift
我有一個擴展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:)
是必需的初始化程序。 但是這種解釋有問題。 從我可以看到,在文檔或Xcode的源代碼視圖中, 未將init(nibName:, bundle:)
, init(rootViewController:)
和init?(coder:)
標記為必需。 出於某種原因,編譯器認為需要init?(coder:)
,但其他init方法則不需要。 這一切都很奇怪。
編輯:你們中的許多人都在發布答案,說明如何使它正常工作。 我的問題不是這個。 正如我在問題中提到的那樣,我已經可以使它起作用。 我的問題是關於Swift初始化程序規則,以及我可能違反的規則。
如果您也重寫了init(nibName:,bundle:)
,那么您的子類也將工作。
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
您還必須提供屬性的默認值。
從情節提要板初始化任何控制器時,都需要實現
required init?(coder aDecoder: NSCoder) {}
當您手動初始化和初始化控制器時,您必須將nib文件名和捆綁包名稱一並告知。 供參考
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
print("init nibName style")
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
擁有此初始化方法是一種好習慣
convenience init() {
self.init()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.