2015-11-19 27 views
3

我想有一個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

+0

你會錯誤地回答。如果你想創建基本控制器,你需要重寫'UIViewController'的一些行爲,這樣當你實現基本控制器的子類化時,你可以真正受益。你不能用擴展重寫'viewWillAppear',因爲你最終會有'viewWillAppear'的2個實現互相調用。你明白我的觀點了嗎? – libec

+0

不知道我是否瞭解確切的調用順序,但我可以想象它可能無法正常工作。你的意思是,如果我使用'BaseVC'協議符合'MyVC'並覆蓋'viewWillAppear',那麼這兩個函數將會互相調用? – gfpacheco

+0

關鍵是編譯器甚至不會讓你在擴展中重寫'viewWillAppear',因爲它們沒有任何重載。覆蓋僅適用於子類化 – libec

回答

2

我通常創建協議,我在其中聲明控制器中有什麼好的。然後,我在基地控制器檢查,如果它的實際執行,如果是的話,只需要使用值,如:

protocol ControllerType { 
    var navigationTitle: String { get } 
} 

extension ControllerType { 
    var navigationTitle: String { 
     return "Default title" 
    } 
} 

class BaseViewController: UIViewController { 

    override func viewDidLoad() { 
     if let controller = self as? ControllerType { 
      self.title = controller.navigationTitle 
     } 
    } 
} 

class ViewController: BaseViewController, ControllerType { 

    var navigationTitle: String { 
     return "ViewController" 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad()  
    } 
} 

倒臺是你要實現ControllerType協議,而且也沒有辦法強制執行。

+0

Tha很好,謝謝分享。不接受任何其他人找到更好的方法 – gfpacheco

相關問題