我想有一個BaseViewController
的子類UIViewController
,覆蓋它的一個方法,但也要求它的子類來實現新的。如何創建一個基本視圖控制器
我的情況有些複雜,但這個簡單的例子代表了我的問題:
我BaseViewController
將覆蓋viewWillAppear
設置它的標題,但標題字符串將來自它的子類。我想過一些選擇,不確定是否/哪一個是最好的。
1 - 與錯誤引發的方法(我目前的解決方案)類: - :
class BaseViewController: UIViewController {
var myTitle: String!
convenience init(title titleSent: String) {
self.init(nibName: nil, bundle: nil)
myTitle = sentTitle
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
title = myTitle
}
}
請注意,此選項得到,如果有更多真正的壞接收稱號構造
class BaseViewController: UIViewController {
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
title = getTitle()
}
func getTitle() -> String {
fatalError("Unimplemented method")
}
}
2參數發送
我認爲使用將是完美的,直到我發現(當然)協議不能繼承一個類。
以前沒有人做過這樣的事嗎?我不這麼認爲,請分享你的想法。
更新
我嘗試另一種方式,但被困在一個編譯器錯誤,將這個不斷工作?編號爲Method does not override any method from its superclass
。
你會錯誤地回答。如果你想創建基本控制器,你需要重寫'UIViewController'的一些行爲,這樣當你實現基本控制器的子類化時,你可以真正受益。你不能用擴展重寫'viewWillAppear',因爲你最終會有'viewWillAppear'的2個實現互相調用。你明白我的觀點了嗎? – libec
不知道我是否瞭解確切的調用順序,但我可以想象它可能無法正常工作。你的意思是,如果我使用'BaseVC'協議符合'MyVC'並覆蓋'viewWillAppear',那麼這兩個函數將會互相調用? – gfpacheco
關鍵是編譯器甚至不會讓你在擴展中重寫'viewWillAppear',因爲它們沒有任何重載。覆蓋僅適用於子類化 – libec