【问题标题】:Swift - Prevent back event in UIViewControllerSwift - 在 UIViewController 中防止返回事件
【发布时间】:2017-04-24 09:25:12
【问题描述】:

我有一个关于取消从 UIViewController 中的后退按钮触发的后退事件的问题。在 Objective-C 中有以下extension。我真的不知道如何将其转换为swift。我到目前为止尝试的是用我自己的函数覆盖 backBarButton,但它不起作用:

    navigation.backBarButtonItem?.action = #selector(MyController.back)
    navigation.backBarButtonItem?.target = self

我搜索了类似委托函数的东西,但找不到任何用于返回按钮的内容。

【问题讨论】:

    标签: ios objective-c swift uiviewcontroller


    【解决方案1】:

    当我遇到这个问题时,我将 extension 重写为 Swift 3

    此解决方案将系统后退按钮保留为“

    public protocol VCWithBackButtonHandler {
         func shouldPopOnBackButton() -> Bool
    }
    
    extension UINavigationController: UINavigationBarDelegate  {
        public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
    
            if viewControllers.count < (navigationBar.items?.count) ?? 0 {
                return true
            }
    
            var shouldPop = true
            let vc = self.topViewController
    
            if let vc = vc as? VCWithBackButtonHandler {
                shouldPop = vc.shouldPopOnBackButton()
            }
    
            if shouldPop {
                DispatchQueue.main.async {[weak self] in
                    _ = self?.popViewController(animated: true)
                }
            } else {
                for subView in navigationBar.subviews {
                    if(0 < subView.alpha && subView.alpha < 1) {
                        UIView.animate(withDuration: 0.25, animations: {
                            subView.alpha = 1
                        })
                    }
                }
            }
    
            return false
        }
    }
    

    用法:

    class ViewController: UIViewController,VCWithBackButtonHandler{
        public func shouldPopOnBackButton() -> Bool {
            return false
        }
    }
    

    【讨论】:

    • 嗨,你能帮我实现一下吗
    • 坦克很多。应该是最好的答案
    • 这不会阻止滑动弹出手势
    【解决方案2】:

    您需要使用navigationItem 的leftBarButtonItem 覆盖backBarButtonItem。这替换了导航栏中的后退按钮,您可以指定要调用的自定义选择器:

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .Done, target: self, action: #selector(self.backAction(sender:)))
    
    func backAction(sender: AnyObject) {
         //Your Code
    }
    

    【讨论】:

    • 这会删除后退按钮。
    【解决方案3】:

    试试这个:

    override func viewDidLoad {
            super.viewDidLoad()
            self.navigationItem.hidesBackButton = true
            let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Bordered, target: self, action: "back:")
            self.navigationItem.leftBarButtonItem = newBackButton
        }
    
    func back(sender: UIBarButtonItem) {
        // Perform your custom actions
        // ...
        // Go back to the previous ViewController
        self.navigationController?.popViewControllerAnimated(true)
    }
    

    【讨论】:

    • 如果您指定leftBarButtonItem,我认为您不需要隐藏后退按钮?
    • 如果后退按钮存在则必填,点击leftbarButton时也会进行交互。
    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 2023-04-02
    • 2014-03-26
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多