Я использую этот специальный метод для анализа HTML с помощью WKWebView:
- (NSString *)stringByEvaluatingJavascript:(NSString *)javascript
{
NSString *string = @"";
[self.webView evaluateJavaScript:javascript
completionHandler:^(id result, NSError *error){
if (error) {
NSLog(@"Javascript:%@\nError: %@", javascript, error.description);
}
else {
NSString *parsedString = (NSString *)result;
NSLog(@"Parsed String: %@", parsedString);
__block string = parsedString;
}
}];
return string;
}
Что я использую вот так:
NSString *count = [self stringByEvaluatingJavascript:@"document.getElementsByTagName('a').length"];
NSLog(@"Count: %@", count);
Он регистрирует:
Count:
Parsed String: 242
Пока я получаю это предупреждение:
Incompatible pointer to integer conversion initializing 'int' with an expression of type 'NSString *__strong'
Как успешно назначить содержимое parsedString ("242") на нить изнутри блока?





Метод, который вы описали в этом вопросе, не должен возвращать никакого значения, потому что переменная string будет инициализирована в completionHandlerevaluateJavaScript. Вам следует использовать этот метод:
- (void)stringByEvaluatingJavascript:(NSString *)javascript
completionHandler:(void(^)(NSString*))completionHandlerForEvaluateJS {
[self.webView evaluateJavaScript:javascript
completionHandler:^(id result, NSError *error) {
if (error) {
NSLog(@"Javascript:%@\nError: %@", javascript, error.description);
completionHandlerForEvaluateJS(nil);
} else {
NSString *parsedString = (NSString *)result;
NSLog(@"Parsed String: %@", parsedString);
completionHandlerForEvaluateJS(parsedString);
}
}];
}
Как это назвать:
[self stringByEvaluatingJavascript:@"document.getElementsByTagName('a').length" completionHandler:^(NSString *count) {
NSLog(@"Count: %@", count);
}];
А по поводу этой ошибки:
Incompatible pointer to integer conversion initializing 'int' with an expression of type 'NSString *__strong'
Вы понимаете это, потому что __block string - это сокращение от int __block string.
Я бы посоветовал передать nil обработчику завершения, если есть ошибка, поскольку пустая строка может быть допустимым результатом.
@rmaddy Это очень хорошая идея, но, как я понял, stringByEvaluatingJavascript никогда не должен возвращать nil.
Точно. Вот почему вы должны использовать completionHandlerForEvaluateJS(nil); внутри if (error) {. Таким образом, вызывающий абонент знает, что произошла ошибка, а не просто пустой результат.
Вам нужно ввести приведение
NSStringкInt. Я не уверен, как в Obj-C ...