覆盖ios后退按钮

Posted

技术标签:

【中文标题】覆盖ios后退按钮【英文标题】:Overwrite ios back button 【发布时间】:2016-04-24 09:09:01 【问题描述】:

我有一个显示网页的 webView 的应用程序。网络由一个主页面和许多子页面组成。当我在主页上时,我希望导航返回按钮保持返回到前一个视图控制器的默认行为。但是当网络在子页面上时,我希望导航返回按钮将网络带到主网页。

所以我需要捕捉用户何时按下后退按钮,如果他在网页子页面上,请将他带到网页主页并防止 webView 关闭。我在想我可以使用 viewWillDisappear() 来捕捉后退按钮,但是如何防止视图关闭?

【问题讨论】:

您是否需要知道如何对 webview 组件进行测试,还是只需要知道如何使用后退按钮按结构设置它? 【参考方案1】:

类似于 KickimusButticus 的回答:

如果您想使用情节提要等更轻松地完成此操作,您可以将后退按钮连接到 IBAction,如下所示:

@IBAction func back() 


并对用户是否在 webview 的子页面中进行内部测试。如果是这样,您可能会弄乱网络视图。如果它们在主页上,您可以简单地使用后退按钮转到您的主视图控制器或使用 self.dismissViewControllerAnimated(true, completion: nil) 关闭该视图控制器。

【讨论】:

我实施了 KickimusButticus 的建议并且它有效。然而,我确实认为这看起来更优雅,所以我尝试了它,但我的 back() 函数永远不会被调用。我想我已经正确地连接了它,它看起来与带有后点的小圆圈一样。有什么建议我可能做错了吗? @Gongevangen 如果您正确连接它,那么每当您单击后退按钮时都应该调用它。我建议您通过查看属性检查器中的连接来检查您是否有正确的连接。也许尝试重新连接它,看看是否有效。【参考方案2】:

看看这篇文章:

Execute action when back bar button of UINavigationController is pressed

在您的视图控制器代码中应该这样做:

override func viewDidLoad() 
    super.viewDidLoad()
    self.navigationItem.hidesBackButton = true
    let customBackButtonItem = UIBarButtonItem(title: "Back", style: .Bordered, target: self, action:#selector(customBackMethod(_:)))
    self.navigationItem.leftBarButtonItem = customBackButtonItem


// @objc is so we can use #selector() up above
@objc func customBackMethod(sender: UIBarButtonItem) 
    if webView.canGoBack 
        webView.goBack()
    

请注意,如果您想要一个“后退”图像,您可能必须使用 UIBarButtonItem(image:, style:, target:, action:) 或 UIBarButtonItem(customView:)。有关详细信息,请参阅此问题和答案:https://***.com/a/36180934/892990

【讨论】:

以上是关于覆盖ios后退按钮的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 UINavigationController 中的后退按钮

Flutter 中的设备后退按钮覆盖

Cordova 后退按钮覆盖默认行为

覆盖后退按钮以充当主页按钮

如何覆盖android中的操作栏后退按钮?

覆盖片段中的后退按钮