如何覆盖self.navigationItem.backBarButtonItem Action?

时间:2015-05-29 06:06:28

标签: ios objective-c

我想覆盖self.navigationItem.backBarButtonItem目标行动

我试过了:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:@selector(backButtonOverrideAction:)];
[self.navigationItem setLeftBarButtonItem:backButton];

它正在运行,但我想使用默认箭头:

enter image description here

我也试过了:

UIBarButtonItem *backButton = self.navigationItem.backBarButtonItem;
[backButton setTarget:self];
[backButton setAction:@selector(backButtonOverrideAction:)];

但不幸的是它不起作用..你知道怎么做吗?

7 个答案:

答案 0 :(得分:10)

仍然,无法直接访问更改 目标 操作 {1}}。

我最终使用了我尝试的第一个...并获得了我的(自定义)图像..

self.navigationItem.backBarButtonItem

而......

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(backButtonOverrideAction:)];
[self.navigationItem setLeftBarButtonItem:backButton];

答案 1 :(得分:3)

您无法将操作分配给BarButton。 解决方案是创建自定义后退按钮。

答案 2 :(得分:1)

适用于11.3:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    let BackItemIndex = 2
    if let subViews = navigationController?.navigationBar.subviews, 
        subViews.count > BackItemIndex {
            navigationController?.navigationBar.subviews[BackItemIndex].subviews.first?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(doPerformAction(_:))))
    }
}

@objc func doPerformAction(_ sender: Any) {
    // some code
}

此解决方案基于搜索活动子视图,直到对应于backBarButtonItem,然后添加UITapGestureRecognizer,以便它捕获元素上的事件。

答案 3 :(得分:0)

摘自Apple Doc说:

  

指定导航项目的按钮时,必须使用   UIBarButtonItem对象。如果要在中显示自定义视图   导航栏,您必须将这些视图包装在UIBarButtonItem中   将对象添加到导航项之前的对象。

这意味着您根本无法使用问题中的方法-2。方法-1是正确的方法。

答案 4 :(得分:0)

我希望它可以帮助你...

BOOL IsOK_Clicked;

-(void)viewDidAppear:(BOOL)animated
{
 IsOK_Clicked = NO;
}
-(void)viewDidDisappear:(BOOL)animated
{
   if(!IsOK_Clicked){
    //Do what you want in Back Click
  }
}
- (IBAction)btnCheckOut:(id)sender {
 IsOK_Clicked = YES;
}

您可以将左栏按钮项添加到导航栏并为其设置自己的选择器功能。

答案 5 :(得分:0)

在swift 3.1中

override func viewDidLoad() {    
// set navigationItem.leftBarButtonItem return to Root
let backToRootVCButton = UIBarButtonItem.init(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(backToRootVCAction))
self.navigationItem.setLeftBarButton(backToRootVCButton, animated: true)

}

func backToRootVCAction() {
    _ = self.navigationController?.popToRootViewController(animated: true)
}

答案 6 :(得分:-1)

您必须执行类似

的操作
self.navigationItem.backBarButtonItem.target = self;
self.navigationItem.backBarButtonItem.action = @selector(backButtonAction:);

这里你必须处理控制器的弹出窗口。