【问题标题】:How to hide the "back" button in UINavigationController?如何隐藏 UINavigationController 中的“返回”按钮?
【发布时间】:2010-11-30 00:35:55
【问题描述】:

你知道如何在 UINavigationController 中隐藏“返回”按钮吗? 还有,怎么显示回来,不过我想这和隐藏很相似……

就像您在查看电子邮件时点击“编辑”时 iPhone 上的邮件应用程序一样。

【问题讨论】:

    标签: ios iphone uinavigationcontroller


    【解决方案1】:

    我刚刚找到答案,在控制器中使用这个:

    [self.navigationItem setHidesBackButton:YES animated:YES];
    

    然后恢复它:

    [self.navigationItem setHidesBackButton:NO animated:YES];
    

    --

    [更新]

    斯威夫特 3.0:

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

    【讨论】:

    • 也从我的错误中吸取教训:在将 navigationItem 推送到 navigationController 之前,您必须调用 setHidesBackButton:。
    • 为什么以前?如果你想推一个 viewController 然后隐藏返回按钮以防止用户返回呢?
    • @codingFriend - 我发现如果您将 setHidesBackButton 放在您不想显示后退按钮的视图的 viewDidAppear 消息处理程序中,这也有效。
    • 最好的事件是 viewWillAppear:animated 隐藏和 viewWillDisappear:animated 恢复它。
    • 终于,苹果在 Xcode 中没有改变的东西。 5 年多过去了,这个答案仍然很有效。
    【解决方案2】:

    为了有条件地隐藏和显示后退按钮,您可以使用以下代码:

    -(void)viewDidAppear:(BOOL)animated
    {
        if ([tempAry count]==0)
        {
            [self.navigationItem setHidesBackButton:YES animated:YES];
        }
        else
        {
            [self.navigationItem setHidesBackButton:NO animated:YES];
        }
        [super viewDidAppear:animated];
    } 
    

    注意:在某些情况下,您必须将其放在 viewDidAppear 方法中,而不是 viewWillAppear 此类情况如下:当您将下一个类的数组更新为上一个类,然后将条件检查到下一个类中时,如上所述。

    【讨论】:

      【解决方案3】:

      在我的 UIViewController 子类中,我有这个方法:

      -(void)setEditing:(BOOL)editing animated:(BOOL)animated {
          [super setEditing:editing animated: animated];
      
          // hide back button in edit mode
          [self.navigationItem setHidesBackButton:editing animated:YES];
      }
      

      【讨论】:

        【解决方案4】:

        Zoran Simic 提出的解决方案由于某种原因对我不起作用。

        但是这段代码确实有效:

        MyController* controller   =   [[MyController alloc]  init];
        NSArray* array             =   [[[NSArray alloc] initWithObjects:controller, nil] autorelease];
        
        [self.navigationController setViewControllers:array animated:NO];
        
        [controller release];
        

        显然,您必须根据自己的喜好操作 NSArray 才能使其适合您。 希望对某人有所帮助:)

        【讨论】:

        • 谢谢!我正在与一个奇怪的错误作斗争,这成功了。不适合所有人,但在适当的情况下很有用。
        【解决方案5】:

        添加此代码

        [self.navigationItem setHidesBackButton:YES];
        

        【讨论】:

          【解决方案6】:

          除了移除后退按钮(使用已经推荐的方法)之外,别忘了在 iOS 7 及更高版本中,用户仍然可以使用从左到右的滑动手势“弹出”到上一个屏幕。

          要禁用它(在适当的时候),请执行以下操作(例如在 viewDidLoad 中):

           if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
               self.navigationController.interactivePopGestureRecognizer.enabled = NO;
          

          【讨论】:

          • Matt - 为您 +1。感谢您添加此注释。很有用。对于任何想知道弹出手势如何工作的人,只需在导航栏上从左向右滑动即可重新创建 Matt 在此处描述的内容。添加上述代码可防止用户在包含它的视图控制器上执行此操作。
          【解决方案7】:

          sethidesbackbutton 出于某种原因对我不起作用

          我是这样用的->

          self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 30)]] ;
          

          【讨论】:

          • 谢谢..我在 setHidesBackButton:YES 没有工作的地方遇到了同样的问题。但这个解决方案适用于 iOS 7。
          【解决方案8】:

          只是为了澄清现有答案:hidesBackButton 属性是正确答案,但在许多答案中并不清楚self 指的是什么。基本上你应该在即将被推送(或刚刚被推送)到UINavigationController的视图控制器中设置self.navigationItem.hidesBackButton = YES。

          换句话说,假设我有一个名为myNavController 的UINavigationController。我想在它上面放一个新视图,当我这样做时,我不想再显示后退按钮。我可以这样做:

          UIViewController *newVC = [[UIViewController alloc] init];
          //presumably would do some stuff here to set up the new view controller
          newVC.navigationItem.hidesBackButton = YES;
          [myNavController pushViewController:newVC animated:YES];
          

          代码完成后,由newVC 控制的视图现在应该会显示出来,并且不会显示返回按钮。

          【讨论】:

          • 正是我第一次做 NavigationController.NavigationItem 时所需要的。谢谢马特。
          【解决方案9】:

          在我的情况下,我对当前答案的问题很少:

          • 在 viewDidLoad/viewWillAppear 内部,只有后退图标被隐藏,字符串“Back”处于非活动状态但仍可见
          • 在 viewDidAppear 内部,后退按钮消失了……但我根本不希望用户看到它

          所以最终对我有用的解决方案是:

          - (id)initWithCoder:(NSCoder *)aDecoder {
              self = [super initWithCoder:aDecoder];
          
              if (self) {
                  [self.navigationItem setHidesBackButton:YES animated:NO];
              }
          
              return self;
          }
          

          【讨论】:

            【解决方案10】:

            Swift iOS(我用过以下)

            // hide back button
                    self.navigationItem.setHidesBackButton(true, animated: false)
            
            // pgrm mark ----- ------
            
                // hide the back button for this view controller
            
                override func setEditing(editing: Bool, animated: Bool) {
                    super.setEditing(editing, animated: animated)
            
                    self.navigationItem.setHidesBackButton(editing, animated: animated)
            
                }// end setEditing
            

            【讨论】:

              【解决方案11】:

              对于简单的问题总是使用 Apple 文档,它们更直接、更轻量级 :)

              以下是 Swift 3.0 的语法:

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

              参考

              https://developer.apple.com/reference/uikit/uinavigationitem#//apple_ref/occ/instm/UINavigationItem/setHidesBackButton:animated:

              【讨论】:

                【解决方案12】:

                这会隐藏后退按钮并用 Swift 中的添加按钮替换它:

                override func setEditing(_ editing: Bool, animated: Bool) {
                    super.setEditing(editing, animated: animated)
                
                    // This hides the back button while in editing mode, which makes room for an add item button
                    self.navigationItem.setHidesBackButton(editing, animated: animated)
                
                    if editing {
                        // This adds the add item button
                        let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
                        // Use the animated setter for the left button so that add button fades in while the back button fades out
                        self.navigationItem.setLeftBarButton(addButton, animated: animated)
                        self.enableBackGesture(enabled: false)
                    } else {
                        // This removes the add item button
                        self.navigationItem.setLeftBarButton(nil, animated: animated)
                        self.enableBackGesture(enabled: true)
                    }
                }
                
                func enableBackGesture(enabled: Bool) {
                    // In addition to removing the back button and adding the add item button while in edit mode, the user can still exit to the previous screen with a left-to-right swipe gesture in iOS 7 and later. This code disables this action while in edit mode.
                    if let navigationController = self.navigationController {
                        if let interactivePopGestureRecognizer = navigationController.interactivePopGestureRecognizer {
                            interactivePopGestureRecognizer.isEnabled = enabled
                        }
                    }
                }
                

                【讨论】:

                  【解决方案13】:

                  斯威夫特 3.

                  一般来说,您应该使用 Apple 的 per-ViewController API,如本页已多次描述的那样,但有时您需要立即控制后退按钮。

                  以下代码隐藏了后退按钮,并确保在隐藏按钮区域不会发生点击碰撞检测。

                  let emptyView = UIView(frame: .zero)
                  self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: emptyView)
                  

                  【讨论】:

                    【解决方案14】:

                    这会隐藏后退按钮

                    let backBtn = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: navigationController, action: nil)
                    
                    
                    navigationItem.leftBarButtonItem = backBtn
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-11-17
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-11-28
                      • 1970-01-01
                      • 2023-03-26
                      • 2011-03-20
                      相关资源
                      最近更新 更多