要在 objective-c 中实现以下 swift 代码?

To implement the following swift code in objective-c?

我正在通过 react-native 实现网络视图。因此,我使用 react-native-webview 库。但是,“window.open”和“window.close”未在 react-native-webview.

中实现

我需要为 social login 应用那部分代码。于是找到了swift代码文档。但是,我不知道如何将此文档更改为 objective-c 代码。

object-c partial code of react-native-webview

 // webView list management
 var webViews = [WKWebView]()
 ...
 func webView(_ webView: WKWebView,
                 createWebViewWith configuration: WKWebViewConfiguration,
                 for navigationAction: WKNavigationAction,
                 windowFeatures: WKWindowFeatures
    ) -> WKWebView? {
        guard let frame = self.webViews.last?.frame else {
            return nil
        }

        //Creating and returning a web view creates a parent relationship with the current web view.
        return createWebView(frame: frame, configuration: configuration)
    }

    /// ---------- popup close ----------
    func webViewDidClose(_ webView: WKWebView) {
        destroyCurrentWebView()
    }

    // Examples of Web View Generation Methods
    func createWebView(frame: CGRect, configuration: WKWebViewConfiguration) -> WKWebView {
        let webView = WKWebView(frame: frame, configuration: configuration)
        
        // set delegate
        webView.uiDelegate = self
        webView.navigationDelegate = self
                
        // add view
        self.view.addSubview(webView)

        self.webViews.append(webView)
        
        return webView
    }

    // Examples of webview deletion methods
    func destroyCurrentWebView() {
        // remove from webview lists and screens
        self.webViews.popLast()?.removeFromSuperview()
    }

如何应用此代码以适应 react-native-webview

编辑

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
  if (!navigationAction.targetFrame.isMainFrame) {
    [webView loadRequest:navigationAction.request];
  }
  WKWebView *popUpWebView = [[WKWebView alloc] initWithFrame: navigationAction.targetFrame configuration: configuration];
  popUpWebView.uiDelegate = self;
  popUpWebView.navigationDelegate = self;
  [_webView addSubview:popUpWebView];
  return nil;
}

- (void)webViewDidClose:(WKWebView *)webView {
  [_webView removeFromSuperview];
}

看了文档,改成如下。但是,构建时出现错误。不知道是什么问题

正如我在评论中提到的,我不确定这是否适用于 React Native,但此 Obj-C 代码与您的 swift 代码相同,应该编译

在您的 .h 文件中

您的 .h 文件可能需要与 RNCWebView.h 相同,并且您可能需要删除任何不需要的/未使用的文件

在您的 .m 文件中

同样,您的 .m 将类似于 RNCWebView.m 并删除您不使用的内容。

然后根据您的 swift 代码,这些是这些函数的更新 Obj C 版本

- (WKWebView *)webView:(WKWebView *)webView
createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
   forNavigationAction:(WKNavigationAction *)navigationAction
        windowFeatures:(WKWindowFeatures *)windowFeatures
{
    
    if (!navigationAction.targetFrame.isMainFrame) {
        [webView loadRequest:navigationAction.request];
    }
    
    if ([webViews count] == 0) {
        return nil;
    }
    
    WKWebView *currentWebView = [webViews lastObject];
    
    WKWebView *popUpWebView = [[WKWebView alloc] initWithFrame: currentWebView.frame
                                                 configuration: configuration];
    
    popUpWebView.UIDelegate = self;
    popUpWebView.navigationDelegate = self;
    [webView addSubview:popUpWebView];
    
    return popUpWebView;
}

- (void)webViewDidClose:(WKWebView *)webView
{
  [webView removeFromSuperview];
}

更新

如果原始 swift 代码中的 webViews 变量未使用/不需要,您可能需要更新 webView createWebViewWithConfiguration 如下:

- (WKWebView *)webView:(WKWebView *)webView
createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
   forNavigationAction:(WKNavigationAction *)navigationAction
        windowFeatures:(WKWindowFeatures *)windowFeatures
{
    
    if (!navigationAction.targetFrame.isMainFrame) {
        [webView loadRequest:navigationAction.request];
    }
    
    WKWebView *popUpWebView = [[WKWebView alloc] initWithFrame: webView.bounds
                                                 configuration: configuration];
    
    popUpWebView.UIDelegate = self;
    popUpWebView.navigationDelegate = self;
    [webView addSubview:popUpWebView];
    
    return popUpWebView;
}

最后,澄清一下:

  • header不需要和我的一样,我只是给你举了一个例子,如果你继承了一个 UIViewController。您可能需要遵循 header 和实现文件定义 here

  • 我的目标是将您的 swift 代码转换为可以编译的 Obj C 代码,但是我不能说它是否适合 React Native。