Home > Software engineering >  To implement the following swift code in objective-c?
To implement the following swift code in objective-c?

Time:03-17

I am implementing the web view through react-native. Therefore, I use the react-native-webview library. However, "window.open" and "window.close" are not implemented in the react-native-webview.

I need to apply that part of the code for social login. So I found the swift code document. However, I don't know how to change this document to an objective-c code.

object-c partial code of react-native-webview

  • swift document
 // 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()
    }

How can I apply this code to suit the react-native-webview?

EDIT

- (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];
}

I looked at the document and changed it as follows. However, an error occurs when building. I don't know what the problem is.

CodePudding user response:

As I mentioned in my comments, I am not sure if this will work for React Native but this Obj-C code is the same as your swift code and should compile

In your .h file

Your .h file will probably need to be the same as RNCWebView.h and you might need to remove anything unwanted / unused

In your .m file

Similarly, your .m will be similar to RNCWebView.m and remove what you don't use.

Then as per your swift code, these are the updated Obj C versions of those functions

- (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];
}

Update

If the webViews variable from the original swift code is unused / not needed, you probably need to update the webView createWebViewWithConfiguration as follows:

- (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;
}

Finally, just to clarify:

  • The header does not need to be the same as mine, I just gave you an example if you were subclassing a UIViewController. You probably need to follow the header and implementation file defined here

  • My goal was to convert your swift code into Obj C code that would compile, I cannot say if it is right for React Native however.

  • Related