【问题标题】:Why is UIWebView canGoBack=NO in iOS7?为什么iOS7中的UIWebView canGoBack=NO?
【发布时间】:2013-09-27 16:58:30
【问题描述】:

我将这个网站嵌入到我的应用中,如下所示:

NSString *url = [NSString stringWithFormat:@"https://mobile.twitter.com/search?q=%@", @"@test OR #test"];
url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[self.twitterWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];

self.twitterWebView.scalesPageToFit = YES;

我有 2 个按钮用于在此网站中返回和前进。我在打电话

[self.twitterWebView goBack];
[self.twitterWebView goForward]; 相应地。

这在 iOS 6 上运行良好,但在 iOS 7 上,我的 web 视图的 canGoBack 和 canGoForward 属性为 NO,因此我的后退和前进按钮不起作用。

附带说明,当第一次安装应用程序并且第一次加载页面时,我的按钮可以工作。但是当我再次运行我的应用程序时,当我点击网站上的链接时,我的 web 视图的 canGoBack 属性开始总是返回 NO。

我该如何解决这个问题?

编辑:我上传了一个迷你测试应用来演示我的问题。您可以从here 下载它。请在 iOS 7 模拟器上运行应用程序,第一次安装应用程序时,请查看后退按钮是否正常工作。然后退出,再次运行应用程序,你会看到它会停止工作。

顺便说一句,问题似乎与 twitter 移动网站有关。你可以试试其他网址看看。

【问题讨论】:

    标签: ios objective-c uiwebview ios7 mobile-website


    【解决方案1】:

    将属性更改为“strong”引用后,我的问题就消失了。

    之前:

     @property (nonatomic, weak) IBOutlet UIWebView *webView;
    

    将属性更改为“strong”后:

     @property (nonatomic, strong) IBOutlet UIWebView *webView;
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。我可以通过以下更改来解决它。

      实现了一个新方法updateButtons

      - (void)updateButtons:(UIWebView*)theWebView {
          if ([theWebView canGoBack])
          {
              self.backButton.enabled = YES;
          }
          else
          {
              self.backButton.enabled = NO;
          }
          if ([theWebView canGoForward])
          {
              self.forwardButton.enabled = YES;
          }
          else
          {
              self.forwardButton.enabled = NO;
          }
           }
      

      shouldStartLoadWithRequest、webViewDidFinishLoad、didFailLoadWithError事件中增加了调用上述方法。

      现在棘手的部分来了。进行上述更改后,后退和前进按钮按预期工作,但在一种情况下除外。当我们通过点击返回按钮返回第一页时,它不会被禁用。因为当通过点击后退/前进按钮加载页面时,它不会触发任何上述事件。它只是从缓存中加载。

      我尝试了很多方法,但只有一种解决了我的问题。

      在 WebHistoryItemChangedNotification 上添加了一个观察者。

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

      在 webViewHistoryDidChange 中调用了相同的 updatebuttons 方法。

      - (void)webViewHistoryDidChange
      {
           [self updateButtons:self.webView];
      }
      

      【讨论】:

      • 此解决方案解决了我的 YouTube 移动页面问题。实际上,我在 4 个函数中调用了 updateButtons:shouldStartLoadWithRequest、webViewDidFinishLoad、didFailLoadWithError 和 webViewHistoryDidChange。当站点是桌面版本时,前三个效果很好。但是在处理移动网站时,我需要第四个功能。
      【解决方案3】:

      这似乎与HTML5's "Application Cache" functionality 有关。首次启动时,该站点未缓存,UIWebView 正确检测它是否可以前进或后退。一旦缓存被填充,新的UIWebView 实例就会决定,即使 URL 发生变化(可以在UIWebViewDelegatewebView:shouldStartLoadWithRequest:navigationType: 中观察到),也不再可能前进或后退。 canGoForwardcanGoBack 将返回 NOgoForwardgoBack 不会做任何事情。只要此特定网站的 HTML5 缓存存在,这种情况在应用重新启动后仍然存在。

      也许这个问题仅限于通过 JavaScript 修改 URL 的 Fragment identifier after the hashmark 的网络应用程序。 是的,UIWebView 在这种情况下的行为在 iOS 6 和 iOS 7 之间确实发生了变化。

      我还没有找到解决方案,我们可能不得不等待 Apple 在 iOS 7.1 左右解决这个问题。

      编辑

      其他人也有这个问题:

      如果您正在使用应用程序缓存并管理 通过散列或其他技术状态,历史对象不会 保留您的导航历史记录,因此 history.back() 将永远无法工作 并且 history.length 永远保持在 1 中。

      (来自http://www.mobilexweb.com/blog/safari-ios7-html5-problems-apis-review

      编辑 2

      Safari 7.0(9537.71,OS X 10.9 Mavericks 中的默认设置)中也存在此问题。但是,最新的WebKit nightly build (r158339) 似乎可以正常工作。修复将其发布到 iOS 和 OS X 版本很可能只是时间问题。

      编辑 3

      这个问题在 iOS 7.1 和 OS X 10.9.2 中仍然存在。

      编辑 4

      此错误已在 iOS 8 和 OS X 的 Safari 7.1 (9537.85.10.17.1) 中修复!

      相关:

      【讨论】:

      • 您的相关链接说他们通过禁用应用缓存来修复。这是怎么做的?谢谢!
      • @Olie 他们的意思是通过不引用 HTML 文档的 head 部分中的清单来完全禁用 HTML5 缓存功能。这不是一个真正的修复......
      • 嗯,那是subOptimal... :\ 有没有像样的工作?
      【解决方案4】:

      我在 iOS 7 中也遇到过这个问题。对我有用的是将“canGoBack”代码和“canGoForward”代码移动到 shouldStartLoadWithRequest,如下所示。之前,我在 webViewDidFinishLoad 中有它,它适用于 iOS 6,但不适用于 iOS 7。

       - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
       navigationType:(UIWebViewNavigationType)navigationType
       {
          if ([webView canGoBack])
          {
              [browserBackItem setEnabled:YES];
          }
          else
          {
              [browserBackItem setEnabled:NO];
          }
          if ([webView canGoForward])
          {
              [browserForwardItem setEnabled:YES];
          }
          else
          {
              [browserForwardItem setEnabled:NO];
          }
          return YES;
      }
      

      【讨论】:

      • 不,这也没有解决我的问题。我相信这个问题正如 Andreas 上面所解释的那样。
      猜你喜欢
      • 2012-02-07
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多