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