簡體   English   中英

在Swift中子類化UITableViewController

[英]Subclassing UITableViewController in Swift

我在Swift中將UITableViewController子類化,並添加了自定義初始化程序:

init(scheduleController: ScheduleController) {
    self.scheduleController = scheduleController
    super.init(style: UITableViewStyle.Plain)
    self.title = "Routes"
}

現在,當我啟動應用程序時,它崩潰了:

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

如何在不添加此初始化程序的情況下解決此問題?

瘋了,不是嗎? 但是錯誤消息告訴您該怎么做: 如果您要調用super.init(style:)那么即使您所做的只是調用super ,您也必須實現init(nibName:bundle:)

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

但是,這提出了關於如何處理屬性的問題。 Swift不會讓您實現init(nibName:bundle:)除非它初始化了所有未初始化的屬性。

  • 一種明顯的解決方案是使您的屬性為Optional; 現在,上面顯示的實現是合法的。 init(scheduleController:) ,必須調用super.init 之后初始化屬性。

  • 不太明顯的是,將您的屬性設置為var而不是Optional。 現在,將其初始化多次:在所有初始化程序的super.init之前,以及init(scheduleController:) super.init 之后

但是,這些都不是我在自己的代碼中使用的解決方案。 在我的代碼中,我不會像您那樣調用super.init(style:) ,而是調用super.init(nibName:bundle:) 之所以有效,是因為:

  • 默認樣式是.Plain ,這是您想要的

  • 即使您想要的是.Grouped ,也可以在關聯的nib文件中指定

這種方法的最大優點是,它允許您的屬性成為非可選的let ,這可能是您真正想要做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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