在 macOS 10.8+ 兼容应用程序中声明 WKWebView 委托
Declare WKWebView delegates in a macOS 10.8+ compatible app
让我说得更清楚一点。我有一个与 macOS 10.8+ 兼容的应用程序,但是如果用户使用的是 macOS 10.10+,我想使用 WKWebView
来提供 him/her 更好的体验。
我创建了一个基于 NSView
的 class,如果用户使用的是 macOS 10.9 或更低版本,它会自动添加 WebView
,如果使用 10.10,它会自动添加 WKWebView
或优越。当我需要声明 WKWebView
导航和 UI 委托时,问题就来了。
我可以毫不费力地添加 WebView 委托函数:
-(WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request;
-(void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation
request:(NSURLRequest *)request frame:(WebFrame *)frame
decisionListener:(id<WebPolicyDecisionListener>)listener;
但是,我需要声明下面的函数来控制 WKWebView 流:
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
forNavigationAction:(WKNavigationAction *)navigationAction
windowFeatures:(WKWindowFeatures *)windowFeatures;
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
但是,两者一起使用 WKWebView
、WKWebViewConfiguration
、WKNavigationAction
、WKWindowFeatures
和 WKNavigationActionPolicy
,这在 macOS 10.9 和下面。
根据我使用 NSUserNotificationCenter
的经验,我知道如果我用这些对象声明一个函数,它的应用程序将在 macOS 10.8 和 10.9 中启动时立即崩溃,因为那些 classes 是'可用。我怎样才能避免这种情况?
我找到了解决问题的方法。 Objective-C 中的选择器不考虑类型,因此我声明 WKWebView 需要的函数具有更原始的 classes,这些函数由原始函数继承:
- (id)webView:(id)webView createWebViewWithConfiguration:(id)configuration
forNavigationAction:(id)navigationAction
windowFeatures:(id)windowFeatures;
- (void)webView:(id)webView decidePolicyForNavigationAction:(id)navigationAction
decisionHandler:(void (^)(NSInteger))decisionHandler;
由于我无法将协议添加到视图 class(因为它们在 macOS 10.9 中也不存在),我收到了一些警告,但这是一个不同的问题。上面的代码有效,并且与 macOS 10.8 和 10.9 兼容,如我所愿。
让我说得更清楚一点。我有一个与 macOS 10.8+ 兼容的应用程序,但是如果用户使用的是 macOS 10.10+,我想使用 WKWebView
来提供 him/her 更好的体验。
我创建了一个基于 NSView
的 class,如果用户使用的是 macOS 10.9 或更低版本,它会自动添加 WebView
,如果使用 10.10,它会自动添加 WKWebView
或优越。当我需要声明 WKWebView
导航和 UI 委托时,问题就来了。
我可以毫不费力地添加 WebView 委托函数:
-(WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request;
-(void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation
request:(NSURLRequest *)request frame:(WebFrame *)frame
decisionListener:(id<WebPolicyDecisionListener>)listener;
但是,我需要声明下面的函数来控制 WKWebView 流:
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
forNavigationAction:(WKNavigationAction *)navigationAction
windowFeatures:(WKWindowFeatures *)windowFeatures;
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
但是,两者一起使用 WKWebView
、WKWebViewConfiguration
、WKNavigationAction
、WKWindowFeatures
和 WKNavigationActionPolicy
,这在 macOS 10.9 和下面。
根据我使用 NSUserNotificationCenter
的经验,我知道如果我用这些对象声明一个函数,它的应用程序将在 macOS 10.8 和 10.9 中启动时立即崩溃,因为那些 classes 是'可用。我怎样才能避免这种情况?
我找到了解决问题的方法。 Objective-C 中的选择器不考虑类型,因此我声明 WKWebView 需要的函数具有更原始的 classes,这些函数由原始函数继承:
- (id)webView:(id)webView createWebViewWithConfiguration:(id)configuration
forNavigationAction:(id)navigationAction
windowFeatures:(id)windowFeatures;
- (void)webView:(id)webView decidePolicyForNavigationAction:(id)navigationAction
decisionHandler:(void (^)(NSInteger))decisionHandler;
由于我无法将协议添加到视图 class(因为它们在 macOS 10.9 中也不存在),我收到了一些警告,但这是一个不同的问题。上面的代码有效,并且与 macOS 10.8 和 10.9 兼容,如我所愿。