Swift-防止UIViewController中的后退事件

Ste*_*ann 4 objective-c uiviewcontroller ios swift

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

    navigation.backBarButtonItem?.action = #selector(MyController.back)
    navigation.backBarButtonItem?.target = self
Run Code Online (Sandbox Code Playgroud)

我搜索了类似委托函数的内容,但是找不到backButton的任何内容。

And*_*rew 8

当我遇到这个问题时,我将此扩展重写为 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
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

class ViewController: UIViewController,VCWithBackButtonHandler{
    public func shouldPopOnBackButton() -> Bool {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)


har*_*hav 5

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

self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .Done, target: self, action: #selector(self.backAction(sender:)))

func backAction(sender: AnyObject) {
     //Your Code
}
Run Code Online (Sandbox Code Playgroud)