在UIViewController
子类中需要声明一个名为webView
的变量,该变量可以是UIWebView
或WKWebView
类型(取决于iOS版本)。
有没有更好的方法(可能使用枚举?)而不是其中一个选项:
UIView
的变量,然后每次需要访问时有条件地转换为两种类型UIViewController
超类中声明变量,而是在两个特定的UIViewController
子类中声明特定类型的变量两次?感觉它违反了“不要重复自己”/ DRY原则。答案 0 :(得分:3)
您可以定义一个协议,其中包含您要在视图上调用的常用方法:
protocol MyWebView {
// ...
}
然后使UIWebView
和WKWebView
符合该协议
(通过扩展名):
extension UIWebView : MyWebView {
}
@available(iOS 8.0, *)
extension WKWebView : MyWebView {
}
现在您可以将实例变量声明为
var webView : MyWebView!
并根据iOS版本进行初始化:
if #available(iOS 8, *){
webView = WKWebView()
} else {
webView = UIWebView()
}
答案 1 :(得分:0)
我在我的应用程序中遇到了类似的问题,使用了不同的弃用框架。这个解决方案对我有用:
创建如下所示的属性:
var webView: AnyObject!
在viewDidLoad
中,使用以下代码初始化网络视图:
if #available(iOS 9, *){
webView = WKWebView()
} else {
webView = UIWebView()
}
在您的代码中,当您需要对此Web视图执行某些操作时,您需要执行类似的操作:
if #available(iOS 9, *){
let newWebView = webView as! WKWebView
// use newWebView
} else {
let oldWebView = webView as! UIWebView
// use oldWebView
}
注意:Martin R建议使用类型别名也可以,但我已经测试了这个解决方案。