【问题标题】:Declare WKWebView delegates in a macOS 10.8+ compatible app在 macOS 10.8+ 兼容的应用程序中声明 WKWebView 委托
【发布时间】:2018-04-10 00:28:04
【问题描述】:

让我更清楚。我有一个与 macOS 10.8+ 兼容的应用程序,但是如果用户使用的是 macOS 10.10+,我想使用WKWebView,以便为他/她提供更好的体验。

我创建了一个基于 NSView 的类,如果用户使用 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;

但是,两者一起使用 WKWebViewWKWebViewConfigurationWKNavigationActionWKWindowFeaturesWKNavigationActionPolicy,它们在 macOS 10.9 及更低版本中不可用。

根据我对NSUserNotificationCenter 的经验,我知道如果我用这些对象声明一个函数,它的应用程序将在 macOS 10.8 和 10.9 中启动时立即崩溃,因为这些类不可用。我怎样才能避免这种情况?

【问题讨论】:

    标签: objective-c macos webview wkwebview


    【解决方案1】:

    我找到了解决问题的方法。 Objective-C 中的选择器不考虑类型,因此我声明了 WKWebView 所需的函数,这些函数具有更多由原始类继承的原始类:

    - (id)webView:(id)webView createWebViewWithConfiguration:(id)configuration 
                                         forNavigationAction:(id)navigationAction 
                                              windowFeatures:(id)windowFeatures; 
    
    - (void)webView:(id)webView decidePolicyForNavigationAction:(id)navigationAction 
                                                decisionHandler:(void (^)(NSInteger))decisionHandler;
    

    由于我无法将协议添加到视图类(因为它们在 macOS 10.9 中也不存在),我收到了一些警告,但这是一个不同的问题。上面的代码可以正常工作,并且与 macOS 10.8 和 10.9 兼容,如我所愿。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多