我的应用程序的一部分是用 JS 编写的,并在 WebView 中运行。我正在使用 UIWebView shouldStartLoadWithRequest 方法来捕获 http 请求,作为 JS 和 obj-c 之间通信的一种方式。这很好用,直到我尝试从 shouldStartLoadWithRequest 方法内部通过我的 webview 加载模态视图控制器。一旦发生这种情况,就不再调用 shouldStartLoadWithRequest。有时我需要关闭这个模态视图控制器并返回到 webview 并做一些事情,然后重新呈现模态控制器。模态控制器第一次出现就很好,然后我将其关闭并尝试通过从 javascript 导航到 URL 再次呈现它,它不再会出现。shouldStartLoadWithRequest 中的 NSLogs 永远不会运行。
在我的javascript中,我做了这样的事情:
window.location='myapp:whateverMethod';
目标 c 代码如下所示:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestString = [[request URL] absoluteString];
NSLog(@"REQUEST URL: %@", requestString);
if([requestString hasPrefix:@"myapp:"]) {
NSArray *components = [requestString componentsSeparatedByString:@":"];
NSString *function = [components objectAtIndex:1];
if([self respondsToSelector:NSSelectorFromString(function)]) {
[self performSelector:NSSelectorFromString(function)];
}
return NO;
}
return YES;
}
-(void) whateverMethod {
NSLog(@"whateverMethod called!");
// This is a quick way to grab my view controller from the storyboard, so assume it exists
UIViewController *splash = [self.storyboard instantiateViewControllerWithIdentifier:@"splashViewController"];
[self presentModalViewController:splash animated:NO];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
[self dismissModalViewController:splash animated:NO];
});
}
此时我的 webview 仍然可见。我在我的 web 应用程序中从一个页面导航到另一个页面,并且所有 javascript 在其中都运行良好,但是不再调用 webview 的“shouldStartLoadWithRequest”委托方法。我不知道为什么。有没有人有任何想法?