【问题标题】:UIWebView loading property never changesUIWebView 加载属性永远不会改变
【发布时间】:2013-03-27 16:50:24
【问题描述】:

我有一个 UIWebView 正在加载一个简单的请求,如下所示:

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"derp.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];
[webView loadRequest:theRequest];

我有另一种方法可以在 webView 上执行一些 JavaScript。此方法可能会从不同的来源(包括 webViewDidFinishLoad 和 viewDidAppear)多次调用。为了防止出现错误,我将其包装在一个 if 语句中,如下所示:

if (!self.webView.loading) {
     ... do stuff....
}

问题是 self.webView.loading 始终为 0。我什至尝试设置一个观察者(尝试了一些不同的变化......不是 100% 确定 sytnax):

[self addObserver:self forKeyPath:@"webView.loading" options:0 context:NULL];

但是 observeValueForKeyPath:ofObject:change:context: 永远不会被调用。

【问题讨论】:

  • 您是否 1. 确定您不总是重新实例化 Web 视图? 2. 知道if() 不会轮询该属性(因为它不是循环)?
  • 1.是的。 2. 是的。如果 webView 正在加载,则回调会触发 JavaScript 执行。如果第一次调用该方法时没有加载,则意味着不会触发回调。
  • 似乎您正在尝试检查 Web 视图是否在下一行加载,改变您调用 loadRequest: on webview 实例,但我知道一旦您获得委托,标志加载将被更改回调 webView:didStartLoading 或 webView:didFinishLoading ! HTH :)

标签: ios objective-c uiwebview key-value-observing


【解决方案1】:

最好实现 UIWebViewDelegate 方法...

在 viewDidLoad 中设置委托:

[webView setDelegate:self];

你可以使用

- (void)webViewDidFinishLoad:(UIWebView *)webView { //加载后执行操作 }`

在加载完成后进行回调,这比搞乱 KVO 可靠得多。

【讨论】:

  • 在这种情况下我不能这样做。 webview 依赖于一些通过 javascript 执行注入的 Objective-c 变量。如果有意义的话,这些变量会在获取内容后发生变化。
  • 嗯,这将是一个问题,因为我从来没有能够成功地使用加载属性并依赖于代表。会考虑的...
【解决方案2】:

通过查看UIWebView doc

isLoading = YES 如果接收方仍在加载内容;否则,否。 那么,是否有可能此时您的 Web 视图的加载已经完成?

【讨论】:

  • 我用 NSLog 试图找出 isLoading 何时/何地为真,但它从来没有。
  • 那么你应该实现 UIWebView 的委托,并在输入 -webViewDidFinishLoad: 时将 BOOL 属性设置为 YES,并测试这个 BOOL 值而不是 webView.isLoading
  • 这就是我最终做的事情......但我认为这就是 UIWebView 上加载属性的全部意义?
  • 但是如果你输入你的if条件,那应该没问题吧?你当时遇到了什么错误?
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多