Add target to stock back button in navigationBar

2019-02-18 21:08发布

I am setting the values of the title and back button in the UINavigationBar as follows:

self.navigationItem.title = @"Post";
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [[UIColor blueColor] colorWithAlphaComponent:0.75f],
                                                                  NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue" size:20]}];
[self.navigationController.navigationBar.backItem setTitle:@"Pop Pop !"];

But i am unable to add target to the backbutton. I have tried the following:

[self.navigationItem.backBarButtonItem setTarget:self];
[self.navigationItem.backBarButtonItem setAction:@selector(goBack:)];

and

self.navigationItem.backBarButtonItem.target = self;
self.navigationItem.backBarButtonItem.action = @selector(goBack:);

But my selector is not being invoked on popping the viewController.

enter image description here

How do I add a target to the backButton, or invoke a selector on popping the viewController ? (I have tried all possible solutions mentioned in SO, in vain)

EDIT: I would to prefer to edit the behaviour of the stock backButton, instead of setting a custom button as the backButton.

6条回答
祖国的老花朵
2楼-- · 2019-02-18 21:31

Off of the top of my head. Try something like this

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                      initWithTarget:self action:@selector(goBack:)];
tap.numberOfTapsRequired = 1;
[self.navigationItem.backBarButtonItem addGestureRecognizer:tap];
查看更多
We Are One
3楼-- · 2019-02-18 21:40

I have two solutions for you, giving that you cannot add a target or action to your back button:

1- Add a new barButtonItem and call it whatever and add your selector to it, and put it in the navigationItem.leftBarButtonItem. Don't forget to pop!

2- Override the viewWillDisAppear method, and do whatever you wanna do there.. if your viewcontroller doesn't direct you to another viewcontroller but the previous one...

if you have any more questions, just ask (Y)

查看更多
淡お忘
4楼-- · 2019-02-18 21:44

You can not change backBarButtonItem action in such a way.

I see here 2 possible solutions:

  1. To implement you custom back button do whatever you want with its actions

  2. Here is nice solution how to override standart back event and block popViewController when needed

https://github.com/onegray/UIViewController-BackButtonHandler/tree/master

查看更多
孤傲高冷的网名
5楼-- · 2019-02-18 21:46

Yo can't add target to back button. You can add leftbarbutton item and addtarget to it.

  UIBarButtonItem *tmpButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backAction:)];
 self.navigationItem.leftBarButtonItem = tmpButtonItem;
查看更多
孤傲高冷的网名
6楼-- · 2019-02-18 21:57

First of hide back button

self.navigationItem.hidesBackButton = YES;

Then You make the custom button

 UIButton *leftbarButton = [UIButton buttonWithType:UIButtonTypeCustom];

 leftbarButton.frame =CGRectMake(70, 3, 65, 32);
 [leftbarButton setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];
 [leftbarButton addTarget:self action:@selector(leftbarbuttonclick) forControlEvents:UIControlEventTouchUpInside];

 UIBarButtonItem *newdbutton =[[UIBarButtonItem alloc] leftbarButton];

AND add it to navigation left bar button item

self.navigationItem.leftBarButtonItem =newbutton;

Now add actions to it

-(void)leftbarbuttonclick {
    // Your code
}
查看更多
男人必须洒脱
7楼-- · 2019-02-18 21:58

You cannot add target to stock BackButton, but you can override a UINavigationBarDelegate method in your CustomNavigationController, like this:

class CustomNavigationController: UINavigationController {

@IBOutlet weak var ibNavigationBar: UINavigationBar!

    override func viewDidLoad() {
        super.viewDidLoad()

        ibNavigationBar.delegate = self
    }

}

extension CustomNavigationController: UINavigationBarDelegate {
    func navigationBar(navigationBar: UINavigationBar, shouldPopItem item: UINavigationItem) -> Bool {
        for viewController in viewControllers {
            if viewController.title == "YourTitledViewController" {
                popToViewController(viewController, animated: true)
            }
        }
        return false
    }
}
查看更多
登录 后发表回答