WKWebView在触发本机代码之前等待DOM呈现

Ran*_*lue 6 javascript objective-c ios hybrid-mobile-app wkwebview

我有一个混合iOS应用程序,其中包含一个WKWebView,我有一个JavaScript函数callNative可以在主线程中调用Objective C本机代码.

在我的JavaScript中,我有以下结构

modifyDOM(); // e.g. .show(), and .hide() stuff
callNative('animateWKWebViewFrame');
Run Code Online (Sandbox Code Playgroud)

出于某种原因,animateWKWebViewFrame(本机代码) modifyDOM完成之前被调用并完全呈现.(这会导致视觉故障.)

在调用本机代码之前,如何强制完全呈现DOM修改?

and*_*kkt 0

如何进行另一个回调来检测modifyDOM()函数?

// alloc webview
    WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
    [theConfiguration.userContentController addScriptMessageHandler:self name:@"interOp"];
    self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) configuration:theConfiguration];
Run Code Online (Sandbox Code Playgroud)

一旦你的modifyDOM()函数完成,你可以调用“interOp”回调,然后你可以用任何想要的回调initiate()并调用animateWKWebViewFrame

- (void)userContentController:(WKUserContentController *)userContentController
      didReceiveScriptMessage:(WKScriptMessage *)message {

    NSDictionary *sentData = (NSDictionary*)message.body;
    NSString* command = sentData[@"command"];

    LOG(@"[userContentController] command(%@)", command);

    if ( [command isEqualToString:@"DOMReady"] ) {
        // defining a JavaScript function
        NSString *jsFunctionText = @"Initiate({"
                                    "command:animateWKWebViewFrame"
                                    "});";
        [self.webView evaluateJavaScript:jsFunctionText completionHandler:^(id object, NSError * err) {
            if ( err ) {
                LOG(@"[evaluateJavaScript] error(%@)", err);
            }
        }];
    } 
Run Code Online (Sandbox Code Playgroud)