在macOS 10.8+兼容应用程序中声明WKWebView委托

时间:2017-10-28 15:23:08

标签: objective-c macos webview wkwebview

让我更清楚一点。我有一个兼容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中的启动时立即崩溃,因为这些类不可用。我怎么能避免这种情况?

1 个答案:

答案 0 :(得分:0)

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

class App(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(700, 100, 350, 380)
        df_rows = 10
        df_cols = 3
        df = pd.DataFrame(np.random.randn(df_rows, df_cols))
        self.tableWidget = TableWidget(df, self)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget)
        self.button = QPushButton('Print DataFrame', self)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)
        self.button.clicked.connect(self.print_my_df)

    @pyqtSlot()
    def print_my_df(self):
        print(self.tableWidget.df)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    ex.show()
    sys.exit(app.exec_())

由于我无法将协议添加到视图类(因为它们在macOS 10.9中也不存在),我收到一些警告,但这是一个不同的问题。上面的代码有效,并且与我想要的macOS 10.8和10.9兼容。