簡體   English   中英

從Swift的UINavigationController繼承

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM