在新 viewController 中加载 UIWebView 时出现 HTTP 错误 -999

HTTP Error -999 when loading UIWebView in new viewController

以下 objective C 代码在点击时失败并显示错误消息“HTTP 任务失败(错误代码:-999)。它在当前 viewController 中加载 UIWebView 时有效,因此它不起作用”与链接无关。这在 phone 和模拟器上都会中断。

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
    NSString *urlString = [_array_url objectAtIndex:recognizer.view.tag];
    NSURL *url = [NSURL URLWithString:urlString];
    NSLog([_array_url objectAtIndex:recognizer.view.tag]);
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
    UIWebView *webview=[[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height)];
    UIViewController *avc = [self.storyboard instantiateViewControllerWithIdentifier:@"ArticleView"];
    [avc.view addSubview:webview];
    [webview loadRequest:urlRequest];
    [self.navigationController pushViewController:avc animated:YES];
}

It works when UIWebView is loaded in the current viewController

所以如果这个有效,那么不要这样做:

UIViewController *avc = [self.storyboard instantiateViewControllerWithIdentifier:@"ArticleView"];
[avc.view addSubview:webview];
[webview loadRequest:urlRequest];
[self.navigationController pushViewController:avc animated:YES];

您违反了这里的所有规则:

  • 您不能在创建另一个视图控制器后立即谈论它的 视图。该视图尚未加载,您正在强制它过早加载。

  • 您不能直接更改另一个视图控制器的界面。

  • 您不得强制 url 请求加载在视图控制器成为视图控制器层次结构的一部分之前开始。

你在这里所做的一切都是错误的。这不是你与视图控制器交谈的方式!

相反,只需给 ArticleViewController 一个 request 属性:

ArticleViewController *avc = (ArticleViewController*)[self.storyboard instantiateViewControllerWithIdentifier:@"ArticleView"];
avc.request = urlRequest;
[self.navigationController pushViewController:avc animated:YES];

是你在创建视图控制器时被允许做的:你可以设置一个属性。就这样!现在 ArticleViewController 可以将 Web 视图添加到 它自己的视图 并在它自己的 viewDidLoad.

中加载请求