从另一ViewController导航栏触发UIWebView加载请求失败求助
嗨,我来帮你排查下为什么点击按钮后ViewController里的WebView没加载请求的问题,咱们一步步来分析:
可能的问题点及解决办法
1. 通知发送时机不对(最可能的原因)
你现在的代码是先发送通知,再执行segue,但这时候ViewController还没完成初始化和viewDidLoad的调用——也就是说,通知发出去的时候,ViewController还没注册Observer,自然接收不到通知,加载逻辑根本没触发。
推荐方案:用Segue传值替代通知(更直接可靠)
通知适合跨页面/跨组件的异步通信,但这种场景下,直接通过segue传递数据是更简洁的方式:
在AnotherViewController里修改代码:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"toURL"]) { ViewController *targetVC = (ViewController *)segue.destinationViewController; // 直接把需要的URL字符串传给目标页面,不用走NSUserDefaults中转 NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"urlSearch"]; targetVC.targetURLString = urlString; } } - (IBAction)actionClick:(id)sender { [self performSegueWithIdentifier:@"toURL" sender:self]; }
然后在ViewController里添加属性并修改加载逻辑:
// 先添加一个接收URL的属性 @property (nonatomic, copy) NSString *targetURLString; - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (self.targetURLString.length > 0) { progressBar.progress = 0; progressBar.hidden = NO; // 修复URL编码问题(废弃API替换+有效性检查) NSString *encodedURLString = [self.targetURLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSURL *url = [NSURL URLWithString:encodedURLString]; if (url) { [webLoad loadRequest:[NSURLRequest requestWithURL:url]]; } else { NSLog(@"生成的URL无效,请检查原始字符串:%@", self.targetURLString); } } }
2. WebView未正确初始化或连接
检查webLoad这个WebView控件:
- 有没有通过IBOutlet正确连接到Storyboard里的控件?
- 如果是代码初始化的,有没有在
viewDidLoad里完成初始化?
你可以在原来的Notification:方法里加个日志,确认WebView是否为nil:
- (void)Notification:(NSNotification *)notification { NSLog(@"webLoad状态:%@", webLoad); // 如果打印是nil,说明控件没连接/初始化 // ... 其他代码 }
3. URL处理存在问题
你用的stringByAddingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding已经被苹果废弃,而且编码方式不适合处理中文、特殊字符等场景,很可能导致生成的NSURL为nil,自然加载无效。
替换成我上面代码里的stringByAddingPercentEncodingWithAllowedCharacters,同时一定要检查生成的url是否有效(非nil)——如果是nil,说明你存在NSUserDefaults里的urlSearch值格式有问题。
4. 通知Observer的注册时机问题
如果一定要用通知方案,那必须保证通知发送时,Observer已经完成注册。你可以把发送通知的逻辑放到ViewController加载完成之后,比如在ViewController的viewDidAppear里主动触发,或者在AnotherViewController的segue完成回调里发通知,但这种方式比segue传值麻烦很多,不推荐。
内容的提问来源于stack exchange,提问作者ioscode

