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 中防止返回事件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JSON.serializer 在 Swift 中解析 JSON
SWIFT 3、Eureka:使用导航控制器时,不调用keyboardWillShow回调
如何在不导入第一个 UIViewController 类的情况下从 UINavigationController 中的另一个 UIViewController 手动释放 UIViewControlle