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