【问题标题】:Disable Back and Forward button on UIToolBar in UIWebview在 UIWebview 中的 UIToolBar 上禁用后退和前进按钮
【发布时间】:2011-01-20 00:53:36
【问题描述】:

我是 iPhone 新手。我想禁用 UIWebView 中 UIToolBar 上的后退(左箭头按钮)和前进(右箭头按钮)按钮。移动网页后要启用后退按钮,然后在需要时启用前进按钮。在我的应用程序中,我通过界面生成器使用底部的工具栏。请任何人帮助我!

【问题讨论】:

    标签: iphone uiwebview


    【解决方案1】:

    对于在WKWebView 中努力解决此问题的开发人员,您需要实现KVO 以在viewDidLoad 方法中观察WKWebViewcanGoBackcanGoForward 属性。

    webView.addObserver(self, forKeyPath: #keyPath(WKWebView.canGoBack), options: .new, context: nil)
    webView.addObserver(self, forKeyPath: #keyPath(WKWebView.canGoForward), options: .new, context: nil)
    

    在观察者方法中

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
            if keyPath == #keyPath(WKWebView.canGoBack) || keyPath == #keyPath(WKWebView.canGoForward) {
                  backButton.isEnabled = webView.canGoBack
                  forwardButton.isEnabled = webView.canGoForward
            }
        }
    

    另外,不要忘记在 ViewController 被释放时移除观察者。

    【讨论】:

      【解决方案2】:

      Swift 的两行解决方案:

      func webViewDidFinishLoad(_ webView: UIWebView) {
          btnBack.isEnabled = webView.canGoBack
          btnForward.isEnabled = webView.canGoForward
      }
      

      【讨论】:

      • 对我来说 canGoForward 总是返回 false 你能帮帮我吗?
      • 在导航返回一级时它应该返回 false,除非您正在导航的页面可能具有哈希样式导航或其他东西。尝试使用其他网站以确保安全。
      【解决方案3】:

      除了 pheelick 的回答之外,我必须进行以下更改,以在您返回第一页时禁用后退按钮,在您转到最后一页时禁用前进按钮。

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

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

      在 webViewHistoryDidChange 中更新按钮状态。

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

      参考:Same is answered here

      【讨论】:

      • 非常感谢。不是现有的最干净的解决方案。但绝对运作良好!!!
      【解决方案4】:

      只需在 webView 的委托方法之一中实现即可。

      - (void)webViewDidFinishLoad:(UIWebView *)webView
      {
      
          if ([webView canGoBack])
              [backbutton setEnabled:YES];
          else
              [backbutton setEnabled:NO];
      
          if ([webView canGoForward])
              [fwdbutton setEnabled:YES];
          else
              [fwdbutton setEnabled:NO];
      }
      

      【讨论】:

        【解决方案5】:

        向按钮对象发送以下消息以启用/禁用:

        // Enable 
        [myButton setEnabled:YES];
        
        // Disable
        [myButton setEnabled:NO];
        

        要确定是否应该显示这些按钮,您应该检查 webview 上的以下属性:

        [myWebView canGoBack];
        [myWebView canGoForward];
        

        您需要在用户加载页面时检查这些内容。为此,请实现 UIWebViewDelegate 方法 webViewDidFinishLoad:

        -(void)webViewDidFinishLoad:(UIWebView *)webView
        {
          // Enable or disable back
          [myBackButton setEnabled:[myWebView canGoBack]];
        
          // Enable or disable forward
          [myForwardButton setEnabled:[myWebView canGoForward]];
        
         }
        

        【讨论】:

          猜你喜欢
          • 2013-03-29
          • 1970-01-01
          • 1970-01-01
          • 2013-05-18
          • 1970-01-01
          • 2011-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多