2015-05-22 143 views
1

我正在使用標準UIWebView,並且需要知道何時stringByEvaluatingJavaScriptFromString:已完成。我知道一個WKWebView有一個完成處理程序,但我需要使用我給出的當前UIWebView。由於該方法需要在主線程上運行,所以GCD不是很有幫助。有什麼建議麼?告訴stringByEvaluatingJavaScriptFromString:已完成

-(void)insertValue:(NSString*)value inWebView:(UIWebView*)webView{ 
    NSString *jsString = [NSString stringWithFormat:kConstantJSString, value]; 
    [webView stringByEvaluatingJavaScriptFromString: jsString]; 
    NSLog("THIS SHOULD LOG WHEN JS HAS EXECUTED"); 
} 
+1

但是'[UIWebView中stringByEvaluatingJavaScriptFromString:]'是同步的,不會返回,直到所有JavaScript代碼進行評價。也許你執行的代碼啓動另一個異步任務(在JavaScript中),這就是爲什麼你覺得不同步。 – Cristik

回答

0

好了,我想出了一個好辦法做到這一點。 在你的JavaScript調用添加此行添加到您的腳本的末尾:

window.location = 'js-ObjC:jsCompleted';

然後使用一個UIWebView的shouldStartLoadWithRequest:方法,以捕捉和測試這個新窗口的位置。然後我在新的窗口位置調用了第二個組件名稱的選擇器。

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ 
if ([[[request URL] absoluteString] hasPrefix:@"js-ObjC:"]) { //get location change 
    NSArray *components = [[[request URL]absoluteString] componentsSeparatedByString:@":"]; 
    NSString *functionName = [components objectAtIndex:1]; 

    /* Calls selector for functionName, this way silences compiler warning */ 
    SEL selector = NSSelectorFromString(functionName); 
    ((void (*)(id, SEL))[self methodForSelector:selector])(self, selector); 

    return NO; 
} 
return YES; 

}

-(void)jsCompleted{ 
    //Do stuff after javascript has completed 

}

相關問題