我的应用程序中的不同 View 需要从服务器获取一些数据,然后使用这些数据执行转场:由于以下 VC 始终相同,我认为定义一个可以保存的协议(protocol)可能是一个好主意我自己每次都复制/粘贴代码。
但是,看起来我不允许覆盖我的 View 将遵循的协议(protocol)中的“prepare for segue”方法。也许我还不太清楚协议(protocol)在 Swift 中是如何工作的?
添加 override 关键字将导致编译器出现“方法不会覆盖其父类(super class)中的任何方法”错误,但无论如何该函数都不会被调用。
protocol StoreGetter : UIViewController {
func showStore(_ storeId: String)
/*override*/ func prepare(for segue: UIStoryboardSegue, sender: Any?) //gives compiler error with override keyword
}
extension StoreGetter {
func showStore(_ storeId : String) {
//... fetches data from server and eventually:
self.performSegue(withIdentifier: "toStoreProfile", sender: store)
//...
}
/*override*/ func prepare(for segue: UIStoryboardSegue, sender: Any?) { //never gets called anyways
if let storeProfileTVC = segue.destination as? StoreProfileTVC {
if let store = sender as? Store {
storeProfileTVC.store = store
}
}
}
}
这样做的目的是不必在每个符合此协议(protocol)的类中复制/粘贴“prepare for segue”方法,因此继承 showStore 方法(我目前正在这样做)
我能想到的另一个选择是:
- 定义另一个继承自 UIViewController 的类
- 使其符合 StoreGetter 并覆盖那里的“准备转场”
- 并将其用作我其他 View 的父类(super class)
...不确定这是否也是一种干净的方法。
解决这个问题的最佳方法是什么?
最佳答案
正如 @Malik 所说,协议(protocol)在这里似乎不是正确的方法。
您应该创建一个 BaseViewController
,在其中定义您的 prepareForSegue
方法,并且您的所有 UIViewController
类都应该继承它。
现在,您可以为需要自定义逻辑的 ViewController
重写 prepareForSegue
。
关于ios - 我可以重写类将遵循的协议(protocol)中的类方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57667256/