基于iOS版本的条件子类

时间:2016-06-04 18:46:58

标签: ios objective-c cordova

这可能有点奇怪,有没有办法根据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默认插件子类化,就会深深扎根于项目中。

2 个答案:

答案 0 :(得分:1)

为不同版本定义了预处理器宏

{{1}}

如果您想在运行时做出决定,可以使用-systemVersion (UIDevice)

当然,在你的Q中你不可能在运行时编译一个不同的类。有两种方法可以处理它:

  • 在运行时创建一个类。这样做,您需要编译方法中的整个代码并将它们放在一起。

  • 在运行时从已编译的类中选择正确的类(或Brandon建议的代码片段)。

这样做有不同的方法。如果它适合您的结构,您可以拥有一个带有两个私有子类的基类,并在您决定的基类中创建实例,创建和传递哪个子类的实例。

答案 1 :(得分:1)

您无法在运行时定义哪个协议符合 compiletime 决策的协议。 (实际上, 是一种使用低级C API的方式,如class_addProtocol,但这里不需要。除非你真的知道你是什么,否则不应该像那样混淆运行时做。)

协议主要是向编译器提示您将支持哪些方法。它允许编译器发出某些警告,例如缺少所需协议方法的实现。

在您的情况下,只需定义您需要的所有协议(“union”;在您的情况下:WKWebView和UIWebView协议)并实现这些方法。然后根据需要在运行时配置对象。这意味着,在某个地方viewDidLoad,决定您是否需要WKWebViewUIWebView并相应地进行设置。或者,如果您正在使用XIB,您可能需要使用两个不同的XIB(一个使用WKWebView,另一个使用UIWebView)并在运行时决定加载哪些。