以编程方式向UINavigationBar添加返回按钮?

4

我正在使用以下代码实现我的应用程序中的导航栏。(当我使用push segue时,我的应用程序崩溃了,所以我需要一个modal segue,这意味着在调用modal segue后导航栏被隐藏)

UINavigationBar *navbar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
//do something like background color, title, etc you self
[self.view addSubview:navbar];

有人知道我可以在上面的代码中使用哪些方法来实现导航栏的后退功能吗?


如果你想在导航栏中有一个返回按钮,为什么不推入视图控制器而不是以模态方式呈现它? - Raja Vikram
好问题:这是因为我不得不将segue类型从push更改为modal,因为每当我点击调用segue的视图控制器中的图像时,它会使我的应用程序崩溃。我也觉得这很奇怪,因为它之前一直运行良好... - thisguy
然后尝试纠正该错误并使用push segue。这样,您就不必使用不必要的代码了。 - Raja Vikram
我尝试着使用push segue触发应用程序时,出现了Thread 1: EXC_BAD_ACCESS错误导致应用崩溃。编译器没有给我任何真正有用的线索来解决它。将segue类型更改为modal是避免崩溃的唯一方法。但我仍不确定使用push segue为什么会导致应用程序崩溃。 - thisguy
可能是在导航栏中添加返回按钮的重复问题。 - Anbu.Karthik
在向@anbu.karthik.i提问之前,我看到了那个问题,但仍然不知道要使用哪个代码,除了我上面的代码... - thisguy
5个回答

4
使用以下代码在导航栏左侧添加返回按钮。在导航栏上添加UIBarButtonItem。
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
                           initWithTitle:@"Back"                                            
                           style:UIBarButtonItemStyleBordered 
                           target:self 
                           action:@selector(backBtnClicked:)];
self.navigationItem.leftBarButtonItem = backButton;

4

使用以下代码在左侧添加返回按钮

   UINavigationBar *navbar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
//do something like background color, title, etc you self
[self.view addSubview:navbar];

UINavigationItem *item = [[UINavigationItem alloc]
                               init];
navbar.items= @[item];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
                               initWithTitle:@"Back"
                               style:UIBarButtonItemStyleBordered
                               target:self
                               action:@selector(backBtnClicked:)];
item.leftBarButtonItem = backButton;

我使用上述代码时收到警告:“在类型为UINavigationbar的对象上找不到属性leftbarbuttonitem”。我还尝试了self.navigationItem.leftBarButtonItem = backButton;,但仍然没有任何效果。这很奇怪...? - thisguy
好的,最终显示了一个返回按钮,但是点击它会导致应用程序崩溃?发生了什么...?有什么想法吗?这就是调试器区域所说的Terminating app due to uncaught exception 'NSInvalidArgumentException',reason: '-[StreamPhotoScreen backBtnClicked:]: unrecognized selector sent to instance 0x16fd66d0' - thisguy
我们是否应该通过编程方式设置performSegueWithIdentifier代码块来防止崩溃? - thisguy
在你的类中定义方法 -(IBAction)backBtnClicked:(id)sender - Gaurav Patel
在 .h 文件中?我需要将它连接到插座吗? - thisguy

2

我认为BackButton比LeftButton更好:


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

1

关于返回按钮,合适的方法不是自己创建。

UINavigationItem类已经提供了适当的支持:

  • func setHidesBackButton(_:animated:)
  • var leftItemsSupplementBackButton: Bool

所以,如果你想在左侧添加一个自定义按钮,只需将leftItemsSupplementBackButton设置为true

或者调用

self.navigationItem.setHidesBackButton(false, animated:false)


1
添加带有图像的返回按钮:
UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 70.0f, 21.0f)];
UIImage *backImage = [UIImage imageNamed:@"backBtn"];
[backButton setImage:backImage  forState:UIControlStateNormal];
[backButton setTitleEdgeInsets:UIEdgeInsetsMake(10.0, 10.0, 10.0, 0.0)];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButton addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[negativeSpacer setWidth:-15];

self.navigationItem.leftBarButtonItems = [NSArray arrayWithObjects:negativeSpacer,backButtonItem,nil];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接