这可能有点奇怪,有没有办法根据iOS版本有条件地进行子类化,基本上是:
if(iOS version >= 9) {
@interface CDVWKWebViewEngine : CDVPlugin <CDVWebViewEngineProtocol, WKScriptMessageHandler, WKNavigationDelegate>
} else if(iOS version = 8) {
@interface CDVWKWebViewEngine : CDVPlugin <WKScriptMessageHandler, WKNavigationDelegate>
}
我有iOS Cordova WkWebView Engine plugin,想要回到iOS 8下的UIWebView(忽略iOS 8上的插件)。
我发现使用这个插件有条件非常棘手,因为它一旦将UIWebView默认插件子类化,就会深深扎根于项目中。
答案 0 :(得分:1)
为不同版本定义了预处理器宏
{{1}}
如果您想在运行时做出决定,可以使用-systemVersion
(UIDevice
)。
当然,在你的Q中你不可能在运行时编译一个不同的类。有两种方法可以处理它:
在运行时创建一个类。这样做,您需要编译方法中的整个代码并将它们放在一起。
在运行时从已编译的类中选择正确的类(或Brandon建议的代码片段)。
这样做有不同的方法。如果它适合您的结构,您可以拥有一个带有两个私有子类的基类,并在您决定的基类中创建实例,创建和传递哪个子类的实例。
答案 1 :(得分:1)
您无法在运行时定义哪个协议符合 compiletime 决策的协议。 (实际上, 是一种使用低级C API的方式,如class_addProtocol
,但这里不需要。除非你真的知道你是什么,否则不应该像那样混淆运行时做。)
协议主要是向编译器提示您将支持哪些方法。它允许编译器发出某些警告,例如缺少所需协议方法的实现。
在您的情况下,只需定义您需要的所有协议(“union”;在您的情况下:WKWebView和UIWebView协议)并实现这些方法。然后根据需要在运行时配置对象。这意味着,在某个地方viewDidLoad
,决定您是否需要WKWebView
或UIWebView
并相应地进行设置。或者,如果您正在使用XIB,您可能需要使用两个不同的XIB(一个使用WKWebView,另一个使用UIWebView)并在运行时决定加载哪些。