Swift - 在 UIViewController 中防止返回事件

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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时也会进行交互。

以上是关于Swift - 在 UIViewController 中防止返回事件的主要内容,如果未能解决你的问题,请参考以下文章

如何只显示部分网页内容(swift)

如何使用 JSON.serializer 在 Swift 中解析 JSON

Swift 3 - 限制 uitextview 中的字符数

SWIFT 3、Eureka:使用导航控制器时,不调用keyboardWillShow回调

如何在不导入第一个 UIViewController 类的情况下从 UINavigationController 中的另一个 UIViewController 手动释放 UIViewControlle

Notification的简单使用