Ios 如何创建基本视图控制器

Ios 如何创建基本视图控制器,ios,iphone,swift,uiviewcontroller,Ios,Iphone,Swift,Uiviewcontroller,我希望有一个BaseViewController子类UIViewController,覆盖它的一个方法,但也需要它的子类来实现新的方法 我的案例有点复杂,但这个简单的案例代表了我的问题: MyBaseViewController将覆盖ViewWillDisplay以设置其标题,但标题字符串将来自其子类。我考虑了一些选择,不确定哪一个是最好的 1-使用错误抛出方法初始化(我当前的解决方案): 2-在constructor中获得标题: class BaseViewController: UIView

我希望有一个
BaseViewController
子类
UIViewController
,覆盖它的一个方法,但也需要它的子类来实现新的方法

我的案例有点复杂,但这个简单的案例代表了我的问题:

My
BaseViewController
将覆盖
ViewWillDisplay
以设置其标题,但标题字符串将来自其子类。我考虑了一些选择,不确定哪一个是最好的

1-使用错误抛出方法初始化(我当前的解决方案):

2-在constructor中获得标题:

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
  }
}
请注意,如果要发送更多参数,此选项将变得非常糟糕

我认为使用
protocol
将是完美的,直到我发现(当然)协议不能对类进行子类化

以前没人做过这样的事吗?我不这么认为,请分享你的想法

更新

我尝试了另一种方法,但遇到了一个编译器错误,这会奏效吗

procotol BaseViewController {
  var myTitle: String { get }
}

extension BaseViewController where Self: UIViewController {
  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    title = myTitle
  }
}

编译器说
方法不会覆盖其超类中的任何方法

我通常创建协议,在协议中声明控制器中最好有什么。然后我检查基本控制器是否实际实现,如果是,只需使用值,如下所示:

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
协议,而无法强制执行它

很好,谢谢分享。没有标记为已接受,以查看是否有其他人找到了更好的方法。你走错了方向。如果要创建基本控制器,则需要覆盖
UIViewController
的某些行为,以便在对基本控制器进行子类化时真正受益。您不能使用扩展来覆盖
viewwillbeen
,因为最终会有两个
viewwillbeen
实现互相调用。你明白我的意思吗?我不确定我是否理解电话的确切顺序,但我可以想象这可能不起作用。你的意思是,如果我将
MyVC
BaseVC
协议一致,并在其上覆盖
viewwillbeen
,这两个函数都将互相调用?问题是编译器甚至不允许你覆盖
viewwillbeen
扩展名,因为没有什么可以覆盖的。重写只适用于子类化。我更喜欢第一种方式。
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()    
    }
}