ios 如何覆盖自己的.navigationItem.backBarButtonItem动作?

jhkqcmku  于 2023-01-06  发布在  iOS
关注(0)|答案(8)|浏览(152)

我想覆盖self.navigationItem.backBarButtonItem的 * 目标 * 和 * 操作 *,
我试过:

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

它是工作,但我想使用默认箭头:

我也尝试过:

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

但不幸的是,它不工作..你有任何想法如何做到这一点?

hc2pp10m

hc2pp10m1#

仍然,无法直接访问self.navigationItem.backBarButtonItem上的更改***目标***和*操作

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

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

而...

//this two lines of code are still useless, i just feel sorry for them.. 
[self.navigationItem.backBarButtonItem setTarget:<#(id)#>];
[self.navigationItem.backBarButtonItem setAction:<#(SEL)#>];
fae0ux8s

fae0ux8s2#

不能为后退BarButton分配操作。解决方法是创建自定义后退按钮。

igetnqfo

igetnqfo3#

在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)
}
bvjxkvbb

bvjxkvbb4#

这适用于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,使其捕获元素上的事件。

vfhzx4xs

vfhzx4xs5#

摘录自Apple Doc
为导航项指定按钮时,必须使用UIBarButtonItem对象。如果要在导航栏中显示自定义视图,则必须将这些视图 Package 在UIBarButtonItem对象中,然后再将其添加到导航项。
这就意味着你根本不能使用问题中的方法2,而方法1才是正确的方法。

z3yyvxxp

z3yyvxxp6#

希望能帮到你...

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;
}

或者您可以在导航栏中添加左栏按钮项,并为其设置您自己的选择器功能。

esbemjvw

esbemjvw7#

“backAction”(iOS16中的新功能)

如果导航栏中已显示后退按钮,则设置此属性将替换其操作,而不修改其外观。否则,设置此属性将生成带有指定操作的图像或标题的后退按钮,除非使用UINavigationItemStyleEditor导航样式。
https://developer.apple.com/documentation/uikit/uinavigationitem/3987966-backaction?language=objc

0s7z1bwu

0s7z1bwu8#

你得做些什么

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

在这里,您还必须处理控制器的弹出。

相关问题