【问题标题】:Programmatically add a back button to a UINavigationBar?以编程方式将后退按钮添加到 UINavigationBar?
【发布时间】:2015-07-03 04:21:13
【问题描述】:

我正在使用以下代码在我的应用中实现导航栏。 (当我使用推送转场时,我的应用程序崩溃了,所以我需要一个模态转场,这意味着在调用模态转场后导航栏是隐藏的)

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

有没有人知道我可以使用上述代码在导航栏中实现后退按钮功能的任何方法?

【问题讨论】:

  • 如果您想要导航栏中的后退按钮,那么为什么不按视图控制器而不是模态显示它呢?
  • 好问题:这是因为我必须将 segue 类型从推送更改为模态,因为每当我点击视图控制器中调用 segue 的图像时,由于某种原因它会使我的应用程序崩溃。我也觉得这很奇怪,因为它工作了很长时间......
  • 然后尝试纠正该错误并使用 push segue。这样你就不必使用不必要的代码了。
  • 我尝试过,但收到 Thread 1: EXC_BAD_ACCESS 错误,因为每当我触发 segue 时应用程序就会崩溃。编译器没有给我真正的线索如何修复它。将 segue 类型更改为 modal 是唯一不会导致崩溃的解决方法。我仍然不确定为什么应用程序在使用 push segue 时会崩溃。

标签: ios objective-c


【解决方案1】:

使用下面的代码在导航栏左侧添加返回按钮。在导航栏上添加 UIBarButtonItem。

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

【讨论】:

    【解决方案2】:

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

       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;,但还是没有。这很奇怪……?
    • 好的,最后显示一个后退按钮,但点击它会使应用程序崩溃?这是怎么回事...?有什么想法吗?这就是调试器区域所说的Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[StreamPhotoScreen backBtnClicked:]: unrecognized selector sent to instance 0x16fd66d0'
    • 我们是否应该以编程方式设置 performSegueWithIdentifier 代码块来阻止崩溃?
    • 在你的类中定义方法 -(IBAction)backBtnClicked:(id)sender
    • 在.h中?我要把它连接到插座吗?
    【解决方案3】:

    添加带图片的返回按钮:

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

    【讨论】:

      【解决方案4】:

      我觉得BackButton比LeftButton好:

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

      【讨论】:

        【解决方案5】:

        关于返回按钮,正确的方法是自己创建。

        UINavigationItem 类对此有适当的支持:

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

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

        或致电

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-19
          • 2014-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多