【问题标题】:webViewDidFinishLoad is not fired when I use goBack使用 goBack 时未触发 webViewDidFinishLoad
【发布时间】:2013-03-23 06:37:00
【问题描述】:

我想在网页加载后做一些额外的工作,所以我在 webViewDidFinished 中添加了一些代码,但是在这种情况下它似乎不起作用。

情况:我用 UIWebview 访问一个网页,然后点击另一个链接,然后运行

[webview goback];

页面似乎是从缓存中加载的,只是

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

被调用,

- (void)webViewDidFinishLoad:(UIWebView *)webView;

没有被调用。

【问题讨论】:

  • 您是否在.h 文件中添加了 UIWebViewDelegate 并将您的 Web 视图与文件的所有者绑定?
  • 开,@ShahPaneri 我必须吗?该函数在这种情况下运行。
  • @ShahPaneri 添加了它。它没有用。
  • - (void) webViewDidFinishLoad:(UIWebView *)webView { NSLog(@"finish loding.."); } 请在这个方法中记录一些东西。所以你可以更具体地说明这个方法是否被调用。 :)
  • @ShahPaneri 实际上我确实做了一些日志,并且我在那里设置了一个断点来检查它......

标签: ios uiwebview uiwebviewdelegate


【解决方案1】:

没错。还有一种方法可以了解历史堆栈的更改:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(webViewHistoryDidChange:)
                                             name:@"WebHistoryItemChangedNotification"
                                           object:nil];

由于UIWebViewcanGoBack 上不兼容 KVO,这似乎是启用/禁用潜在后退按钮的唯一方法。

【讨论】:

  • Xcode 错误指出它找不到 WebHistoryItemChangedNotification。我确实将 import WebKit 添加到我的 uiwebView 控制器。有什么想法吗?
  • @shrutim:这是一个监听私人通知的黑客。因此,您需要将@"WebHistoryItemChangedNotification" 订阅为字符串,而不是符号。
  • erm 似乎没有为我开除。有谁知道这是否仅适用于 UIWebView 或者它是否也适用于 WKWebKit(我正在使用)。
【解决方案2】:

无论多么古怪,我怀疑这是正确的行为。来自 Apple 文档:

webViewDidFinishLoad:

在网络视图完成加载框架后发送。

我敢打赌,UIWebView 缓存了一定数量的页面,goBackgoForward 方法不保证存储在后向列表中的位置被重新加载。因此不会触发webViewDidFinishLoad

但即使这可能是正确的行为,我当然同意这是糟糕的 API 设计。肯定应该有一个finishLoad-ish 方法来挂钩以进行后退/前进/页内导航。

【讨论】:

  • 这似乎是一个合理的答案。
  • @rivera 有人告诉我,借口和解释之间的界限也很窄:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多