2015-05-22 3 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 не оценивается. Возможно, код вашего запуска запускает другую задачу async (в javascript), поэтому вы чувствуете, что это не синхронно. – Cristik

ответ

0

Хорошо, поэтому я придумал хороший способ сделать это. В вашем яваскрипте вызова добавить добавить эту строку в конец сценария:

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 

}

Смежные вопросы