动作导航栏后退按钮

时间:2017-02-08 04:14:32

标签: ios swift

我想在用户点击后退按钮时显示确认提醒。这就是我尝试添加操作的方式。

self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "<", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ViewController.save(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton

这工作正常,但我想要默认的后退按钮图像,而不是自定义标题。怎么做?

我也尝试了以下代码:

self.navigationItem.backBarButtonItem?.action = #selector(ViewController.save(sender:))

...但是也没有执行动作。

6 个答案:

答案 0 :(得分:2)

这可能会有所帮助。这不会覆盖后退操作,但您可以执行其他任务。

目标c

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    if(self.isMovingFromParentViewController)
    {
        //On click of back or swipe back
    }
    if(self.isBeingDismissed)
    {
        //Dismissed
    }
    NSLog(@"%d",self.isBeingDismissed);
    NSLog(@"%d",self.isMovingFromParentViewController);
}

夫特

override func viewWillDisappear(_ animated: Bool)
{
    super.viewWillDisappear(animated);
    if self.isMovingFromParentViewController
    {
        //On click of back or swipe back
    }
    if self.isBeingDismissed
    {
        //Dismissed
    }
}

答案 1 :(得分:1)

我找到了解决方法!

我在iOS 11和iOS 13上对其进行了测试,并且效果很好:)

protocol CustomNavigationViewControllerDelegate {
    func shouldPop() -> Bool
}

class CustomNavigationViewController: UINavigationController, UINavigationBarDelegate {
    var backDelegate: CustomNavigationViewControllerDelegate?

    func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
        return backDelegate?.shouldPop() ?? true
    }
}

class SecondViewController: UIViewController, CustomNavigationViewControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()

        (self.navigationController as? CustomNavigationViewController)?.backDelegate = self
    }

    func shouldPop() -> Bool {
        if (needToShowAlert) {
            showExitAlert()
            return false

        } else {
            return true
        }
    }
}

答案 2 :(得分:0)

我不知道你试图取得什么,但是当vieWillDisappear:被召唤时,它不是一个可能的解决方案,你想做什么?这可能是一个匹配的入口点,没有摆弄其他答案中建议的后退按钮。

<强>更好 另一个选择是实施UINavigationControllerDelegate,将控制器设置为delegate,然后在navigationController(_:willShow:animated:)中实施提醒。

查看here以供参考。

答案 3 :(得分:0)

您需要向导航栏添加自定义后退按钮,并向其添加操作

      let backButton = UIBarButtonItem (image: UIImage(named: "ico-nav-prev")!, style: .plain, target: self, action: #selector(GoToBack))
      self.navigationItem.leftBarButtonItem = backButton
      self.navigationItem.hidesBackButton = true

     func GoToBack(){

        self.navigationController!.popViewController(animated: true)

      }

答案 4 :(得分:0)

我认为answer应该完成这项工作。

您基本上使用默认样式创建按钮并注册选择器。

您可以尝试this代替 backButton 而不是leftButton:

<强>目标C

UIBarButtonItem *backBtn = [[UIBarButtonItem alloc] init];
[desVC.navigationItem setBackBarButtonItem:backBtn];

<强>夫特

let backBtn = UIBarButtonItem()
self.navigationItem.backBarButtonItem = backBtn

答案 5 :(得分:0)

ParentViewController的{​​{1}}方法中调用此行代码而不是viewDidLoad

ChildViewController

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

中删除以下代码行
ChildViewController

你会好的!如果您需要为此转换创建操作,我的意思是每当用户点击self.navigationItem.hidesBackButton = true 的后退按钮时。只需在ChildViewController

中调用此方法即可
ChildViewController

<强>编辑:

ChildViewController

 override func didMove(toParentViewController parent: UIViewController?) {
    super.didMove(toParentViewController: parent)

    if parent == nil {

    } else {

    }
}

ParentViewController

 override func didMove(toParentViewController parent: UIViewController?) {
    super.didMove(toParentViewController: parent)

    if parent == nil {
        NotificationCenter.default.post(name: NSNotification.Name.init("Post"), object: nil)
    } else {

    }

}

这是有效的,但有这样的问题:

警告:在演示文稿正在进行时尝试演示!

因此我不推荐。祝你好运