【问题标题】:UINavigationBar custom back button without titleUINavigationBar 自定义后退按钮不带标题
【发布时间】:2013-09-23 02:07:41
【问题描述】:

如何在 iOS 7 及更高版本中自定义没有标题的导航返回按钮? (即仅使用箭头)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

我只是想知道他们是否有任何 self.backButtonItem;

这样的?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

【问题讨论】:

  • 您可以使用@hiroshi answer + 导航栏 tintColor 属性来制作带有自定义颜色且没有任何标题的人字形
  • 对于那些有标签栏的人,并且你不想要返回按钮的文本,解决方法是:在 TabBarController 的 viewDidLoad() 中放置:self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

标签: ios user-interface uinavigationbar


【解决方案1】:

其实很简单,我就是这样做的:

目标 C

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

斯威夫特 2

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

斯威夫特 3

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

将这条线放入正在推送到堆栈的视图控制器中(前一个视图控制器)。新推的视图控制器后退按钮现在将显示您为 initWithTitle 放置的任何内容,在本例中为空字符串。

【讨论】:

  • 我用了这个,但标题以动画方式出现和消失??
  • 谢谢凯尔!我一直在寻找一种方法来重命名 iOS 7 中的默认后退按钮。我把它放在我的 prepareForSegue 中的视图控制器中,它工作得很好。
  • @user1010819 这是预期的行为,barButtonItems 将在切换视图控制器时动画进出。你想完成什么?
  • @YiweiGao 没问题!如果您知道正确的代码,这只是其中之一,它非常简单!我很高兴它有帮助!
  • 我觉得这个需要更新,它现在什么都没有显示,默认情况下没有箭头?
【解决方案2】:

我找到了一种使用 iOS 单箭头制作后退按钮的简单方法。

假设您有一个导航控制器从 ViewB 转到 ViewA。在 IB 中,选择 ViewA 的导航栏,您应该会看到以下选项:Title、Prompt 和 Back Button。

ViewA 导航栏选项

诀窍是在 previous 视图控制器 (View A) 的选项中选择您的命运视图控制器后退按钮标题 (ViewB)。如果不填写“Back Button”选项,iOS 会自动放置标题“Back”,并带有 previous 视图控制器的标题。所以,你需要用一个空格填充这个选项。

在“返回按钮”选项中填充空格

结果:

【讨论】:

  • 欢迎来到Stack Overflow。如果您还没有,请查看我们是什么tour,并阅读help center 中的一些文章,了解我们的工作方式和这里的一些社区习俗。如果您在网站功能方面需要任何帮助,请不要害怕搜索,然后在 Meta Stack Overflow 上提问(如果您仍然找不到答案)。谢谢,祝你好运!无论如何,你现在可以发布你的图片了...... :)
  • 它有效,请注意 - 您需要为 previous 控制器(例如导航控制器中的 rootViewController)设置“返回按钮”
  • 确保您没有在 ViewA 中的导航项上将“hidesBackButton”设置为 TRUE
  • 在我看来,如果呈现控制器的标题足够长,这将有效 - 如果它是一个短标题,它将被使用。
  • 对我而言,它仅在 源和目标 ViewController 的 NavigationItem 将 Back Button 设置为单个空格字符(即 ViewA 和 ViewB)时才有效
【解决方案3】:

只需使用图像!

OBJ-C

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

SWIFT 4

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

图标返回.png

图标-Back@2x.png

图标-Back@3x.png

【讨论】:

  • 使用此解决方案,您似乎失去了“滑动返回”功能。
  • navigationController?.interactivePopGestureRecognizer?.delegate = self 可以保持向后滑动手势
  • 我一直在寻找这个答案,也许是我的一生,也就是动作选择器。
【解决方案4】:

iOS7 有新的界面规则,所以在推送 UIView 时最好至少保留后退箭头。 以编程方式更改“后退”文本非常容易。只需在推送视图之前添加此代码(或者如果您使用 StoryBoards,则为 prepareForSegue):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

这将更改默认的“后退”文本,但会保留 iOS7 样式的后退箭头。 您还可以在推送视图之前更改后退箭头的色调颜色:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

希望对您有所帮助!

【讨论】:

  • 这非常有效,并且似乎比其他选项更好。例如,与其他一些答案不同,标题永远不需要重置为以前的值。
【解决方案5】:

您无需做太多事情。您可以通过情节提要本身实现相同的目的。

只需转到根导航控制器并留出空间即可。记住不要给你想要没有标题的后退按钮的控制器,而是给根导航控制器。

【讨论】:

  • 我试过了,它有效。但是我仍然无法更改代码中的标题。
  • 使用 XCode7,但在 xCode8 中不再工作 -> ios10.X,我使用了@iwasrobbed 方法
  • 所有的天才都很简单!
【解决方案6】:

虽然Kyle Begeman's answer 完全可以解决问题,但在每个可能的视图控制器中都有这段代码是很烦人的。我最终得到了一个简单的UINavigationItem 类别。当心,这里有龙!对不起,我的意思是,混搭:

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end

【讨论】:

  • 我投了赞成票,但后来决定改用更简单的 hack -- [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; (source) -- 可能不那么优雅,但 swizzling 感觉有点矫枉过正
  • 说真的你们...不要放弃任何其他解决方案。实施作为类别发布的解决方案@nicky,不要三思而后行。如果您添加此 Prefix.pch 文件,这是一个很好的可重用解决方案,可以在应用程序范围内实施。 Apple 鼓励使用categories to add Methods to Existing Classes,您应该尽可能利用它。
  • 这是我认为最好的解决方案,无论如何“method_exchangeImplementation”有点不安全,看看这个:Right way to swizzle 和这个NSHipster swizzling guide
  • @AlessandroOrrù 在这种特殊情况下,这应该是安全的,因为 swizzled 方法是 UINavigationItem 自己的方法,不涉及继承。而_cmd 不太可能参与吸气剂。无论如何,这是一个好点。所以你们,如果你的项目中有这么多 swizzling helpers 中的任何一个,请确保你也在这里使用它。
【解决方案7】:

这可行,但它会删除前一个项目的标题,即使你弹回它:

self.navigationController.navigationBar.topItem.title = @"";

只需在推送的 View Controller 的viewDidLoad 上设置此属性即可。

【讨论】:

  • 这将删除前一个项目的标题,即使您弹回它。不是很好:(
  • 我在viewWillAppear上设置了推送VC的标题,所以它总是设置正确。
  • @GutoAraujo 它可以工作,但标题会以 1 或 2 秒的延迟重新出现,这使得 UX 不太好。
  • 在 xCode8 -> ios10.X 这似乎是解决问题的唯一方法
【解决方案8】:

编辑:2014-04-09:当我获得声誉时,我感到很抱歉,因为我不再使用这个技巧了。我推荐凯尔的回答。还要注意self.navigationItem.backBarButtonItemself 不是显示后退按钮的视图控制器,而是要返回的前一个视图控制器。

如果你不需要前一个视图控制器的标题文本,只需在标题中填充一个空白字符串即可;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

这将防止在推送的视图控制器上显示带有 V 形的“后退”。

编辑:即使您使用非空白标题文本,在viewWillAppear: 中设置前一个视图控制器的标题也有效,但在视图控制器弹出时标题可能会闪烁。我认为“推特应用程序”似乎做了更微妙的破解来避免闪烁。

【讨论】:

  • 我在这里遇到的唯一问题是,当我点击导航栏返回时,前一个视图的标题变为空白。有什么办法吗?
  • @Alioo 你试过我在“编辑”行中提到的吗?
【解决方案9】:

这就是我的做法,也是最简单、最有效、最清晰的做法。

如果嵌入在Navigation Controller 上,这将有效

斯威夫特 3

viewDidLoad 中,我将它添加到视图控制器中,您希望后退按钮只是箭头。

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

这与@Kyle Begeman 的回答的不同之处在于您在视图控制器上调用它,您希望后退按钮只是箭头,而不是在推送堆栈视图控制器上。

【讨论】:

    【解决方案10】:

    您无法以您想要的方式访问导航 backButtonItem,您需要创建自己的后退按钮,如下所示:

    - (void)loadView
    {
        [super loadView];
        UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
        [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
        [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    }
    

    当然:

    - (void) popVC{
      [self.navigationController popViewControllerAnimated:YES];
    }
    

    【讨论】:

    • 然后我们丢失了后退按钮上发生的漂亮的淡出动画
    • 你需要一个平滑过渡的蒙版。 "* 如果您想使用自定义图像来替换默认的 V 形,您还需要创建自定义蒙版图像。iOS 7 使用蒙版使前一个屏幕的标题在导航过程中出现或消失在 V 形中过渡。”
    • @null 你将失去 iOS 7 的左右滑动手势!
    • @user 我得到了自定义图像,但默认情况下色调为蓝色。我怎样才能不添加色调?谢谢
    【解决方案11】:

    目标:UINavigationBar 上的所有后退按钮自定义为白色图标

    步骤: 1.在AppDelete的“didFinishLaunchingWithOptions”方法中:

    UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];
    
    
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        [UINavigationBar appearance].tintColor = [UIColor whiteColor];
        [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
        [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
    }else{
    
        UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
        [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    
        [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
    }
    

    2.在普通超ViewController类的viewDidLoad方法中:

     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
            UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                         style:UIBarButtonItemStylePlain
                                                                        target:nil
                                                                        action:nil];
            [self.navigationItem setBackBarButtonItem:backItem];
        }else{
            //do nothing
        }
    

    【讨论】:

    • 这显示警告“SYSTEM_VESION_ 的隐式版本...”在 C99 中无效。
    【解决方案12】:

    SWIFT 4

    对于那些希望创建自定义后退按钮以及删除其标题的人,请在推送新按钮的视图控制器中使用以下代码:

    self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
    self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
    self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    

    为了更普遍的使用,请执行以下操作:

    1. 创建一个通用函数如下:

      func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
          navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
          navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
          navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
      }
      
    2. 然后在视图控制器中使用如下:

      addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
      

    【讨论】:

      【解决方案13】:

      来自 iOS6 的简单 hack 也适用于 iOS7:

      [UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
      

      编辑: 不要使用这个黑客。详情见评论。

      【讨论】:

      • 不要使用这个技巧。 Apple 在 64 位设备上的代码中存在一个错误,当您制作条形按钮标题偏移时,该错误将阻止模式视图出现。 More details.
      • 嗯,只有设备有问题,模拟器没有。
      • 当使用 Xcode 9 / iOS 11 构建时,此 hack 不再有效。“
      【解决方案14】:

      你可以使用它。只需添加一个UIButton 作为UIBarButtonItem 的自定义视图,这对我来说非常有效。

      试试下面的代码

          self.navigationItem.leftBarButtonItem=[self backButton];
      
      
      - (UIBarButtonItem *)backButton
      {
          UIImage *image = [UIImage imageNamed:@"back-btn.png"];
          CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);
      
          UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
          [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
          [button setImage:image forState:UIControlStateNormal];
      
          UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];
      
          return item;
      }
      

      【讨论】:

      • 但是,这将禁用 iOS 7 中的向后滑动手势
      【解决方案15】:

      为根视图控制器创建一个带有所需标题的UILabel,并将其分配给视图控制器的navigationItem.titleView

      现在将标题设置为空字符串,您按下的下一个视图控制器将有一个没有文本的后退按钮。

      self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
      self.title = @"";
      

      【讨论】:

        【解决方案16】:
         // add left bar button item
        
        try this code:
        
        - (void)viewDidLoad
        { 
            [super viewDidLoad];
        
           UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
            CGRect backframe = CGRectMake(250, 9, 15,21);
            UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
            [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
            [backbutton addTarget:self action:@selector(Btn_back:)
                 forControlEvents:UIControlEventTouchUpInside];
            [backbutton setShowsTouchWhenHighlighted:YES];
            UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
            self.navigationItem.leftBarButtonItem=backbarbutton;
            [backbutton release];
        
        }
        -(IBAction)Btn_back:(id)sender
        {
            [self.navigationController popViewControllerAnimated:YES];
        
        }
        

        【讨论】:

          【解决方案17】:

          所有答案都不能解决问题。在每个视图控制器中设置返回按钮标题是不可接受的,并且在标题上添加偏移量仍然会使下一个视图控制器标题向右移动。

          这里是使用method swizzling的方法,只是为UINavigationItem创建新的扩展

          import UIKit
          
          extension UINavigationItem {
              public override class func initialize() {
          
              struct Static {
                  static var token: dispatch_once_t = 0
              }
          
              // make sure this isn't a subclass
              if self !== UINavigationItem.self {
                  return
              }
          
              dispatch_once(&Static.token) {
                  let originalSelector = Selector("backBarButtonItem")
                  let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)
          
                  let originalMethod = class_getInstanceMethod(self, originalSelector)
                  let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
          
                  let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
          
                  if didAddMethod {
                      class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
                  } else {
                      method_exchangeImplementations(originalMethod, swizzledMethod)
                  }
              }
          }
          
          // MARK: - Method Swizzling
          
          struct AssociatedKeys {
              static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
          }
          
          func noTitleBackBarButtonItem() -> UIBarButtonItem? {
              if let item = self.noTitleBackBarButtonItem() {
                  return item
              }
          
              if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
                  return item
              } else {
                  let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
                  objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                  return newItem
              }
          }
          }
          

          【讨论】:

          • 将后退按钮设置为后退,效果很好:self.navigationItem.backBarButtonItem.title = @"Back";
          • 你是什么意思?问题是关于从后退按钮中删除文本?
          • 很多 App 和 Apple 自己的 App 都说“
          【解决方案18】:

          我在 viewDidLoad 中应用了以下代码,它可以工作:

            // this will set the back button title
          self.navigationController.navigationBar.topItem.title = @"Test";
          
           // this line set the back button and default icon color  
          
          //[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];
          
          this line change the back default icon to your custom icon
          [[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];
          

          只是为了更新我使用矢量图标

          【讨论】:

            【解决方案19】:

            可以继承UINavigationController,将自己设置为delegate,在delegate方法navigationController:willShowViewController:animated:中设置backBarButtonItem@

            @interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>
            
            @end
            
            @implementation Custom_NavigationController
            
            - (void)viewDidLoad
            {
                [super viewDidLoad];
            
                self.delegate = self;
            }
            
            #pragma mark - UINavigationControllerDelegate
            
            - (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
            {
                viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
            }
            
            @end
            

            【讨论】:

              【解决方案20】:

              将标题置空

              UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
              [backButton setTintColor:Color_WHITE];
              [self.navigationItem setBackBarButtonItem:backButton];
              

              换回图片

               UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
              [UINavigationBar appearance].backIndicatorImage = backImg;
              [UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;
              

              【讨论】:

                【解决方案21】:

                检查这个答案

                How to change the UINavigationController back button name?

                title 文本设置为string,并留一个空格,如下所示

                title = " "
                

                没有足够的声望来添加 cmets :)

                【讨论】:

                  【解决方案22】:

                  我从 iOS 5 开始就一直在使用这个解决方案,没有任何问题。我制作了一个实用函数,我在视图控制器中调用它。您需要在 viewDidLoad 或之后的任何时间点执行此操作。

                  void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
                  {
                      if(! viewController.navigationItem.backBarButtonItem)
                      {
                          viewController.navigationItem.backBarButtonItem =
                          [[UIBarButtonItem alloc] initWithTitle:text
                                                           style:UIBarButtonItemStylePlain
                                                          target:nil action:nil];
                      }
                      else
                      {
                          viewController.navigationItem.backBarButtonItem.title = text;
                      }
                  }
                  

                  在某些情况下导航项可能已经存在,在其他情况下需要创建。这在不影响导航项标题的情况下解决了这两种情况。它允许您通过简单地传递 @"" 来删除标题。

                  【讨论】:

                  • 这是正确答案。没有技巧。这只是按照它的本意使用 iOS API 来设置标题。将其设置为 @"" 以删除标题(经过测试并且工作正常)。
                  【解决方案23】:

                  对我有用的唯一方法是:

                  navigationController?.navigationBar.backItem?.title = ""
                  

                  更新:

                  当我将 segue 动画标志更改为 true(之前为 false)时,唯一对我有用的方法是:

                  navigationController?.navigationBar.topItem?.title = ""
                  

                  【讨论】:

                    【解决方案24】:

                    如果您在导航控制器中嵌入了两个 ViewController(FirstVC, SecondVC),并且您希望 SecondVC 中只有后退箭头。

                    你可以试试这个 在FirstVC的ViewDidLoad中

                    override func viewDidLoad() {
                        super.viewDidLoad()
                        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
                    }
                    

                    然后当你推入 SecondVC 时,你会看到只有返回箭头

                    【讨论】:

                      【解决方案25】:

                      如果你设置了 NavigationBar 的 tintColor,添加一个自定义的没有标题的后退按钮图像,该 tint 颜色将反映图像颜色。请点击此苹果文档链接。

                      https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

                      UINavigationItem *navItem = [[UINavigationItem alloc] init];
                         navBar.tintColor = self.tintColor;
                      
                         UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
                           myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
                      
                           UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
                           navItem.leftBarButtonItem = leftButton;
                      
                          navBar.items = @[ navItem ];
                      

                      【讨论】:

                        【解决方案26】:

                        我写了一个扩展来简化这个:

                        extension UIViewController {
                        
                            /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
                            @objc var backButtonTitle: String? {
                                get {
                                    return navigationItem.backBarButtonItem?.title
                                }
                                set {
                                    if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                                        existingBackBarButtonItem.title = newValue
                                    }
                                    else {
                                        let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                                        navigationItem.backBarButtonItem = newNavigationItem
                                    }
                                }
                            }
                        
                        }
                        

                        【讨论】:

                          【解决方案27】:

                          您可以在 viewWillDisappear 上将当前 ViewController 的标题更改为 @"",并在它即将再次显示时将标题重新设置为之前的任何内容。

                          -(void) viewWillAppear:(BOOL)animated {
                              [super viewWillAppear:animated];
                              self.title = @"Previous Title";
                          }
                          
                          -(void) viewWillDisappear:(BOOL)animated {
                              [super viewWillDisappear:animated];
                              self.title = @"";
                          }
                          

                          【讨论】:

                            【解决方案28】:

                            在第一个 ViewController 的 prepareForSegue: 方法中,您将该视图标题设置为 @"",因此当推送下一个视图时,它将显示上一个 ViewController 标题,即 @""。

                            -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
                                self.navigationItem.title = @" ";
                            }
                            

                            唯一的问题是,当您点击返回按钮时,您之前的视图将没有标题,因此您可以在 viewWillAppear 上再次添加它:

                            -(void)viewWillAppear:(BOOL)animated{
                               self.navigationItem.title = @"First View Title";
                            }
                            

                            我不太喜欢这个解决方案,但它确实有效,而且我没有找到其他方法。

                            【讨论】:

                            • 查看我的答案以获得正确的解决方案,而不会弄乱导航项标题。
                            • 您的解决方案是否保留了 iOS7 后退箭头?我尝试了类似的方法,但它删除了箭头。
                            • 它在 iOS 7 中保留了后退箭头,是的。在 iOS 6 中,传入一个空白(0 长度)字符串也会完全删除按钮,所以这样做只对 iOS 7 有好处。
                            • 有一个非常简单的解决方案。看看我的答案是否适合你。
                            【解决方案29】:

                            要添加到上面的Thomas C's answer,有时放置一个空格不起作用,您必须不断添加空格。

                            当您在“导航项”下看到“条形按钮项-”时,您就知道您成功了。那在文档大纲中(编辑器->显示文档大纲)。看到上图后,可以删掉几个空格,看看还能不能用。

                            【讨论】:

                              【解决方案30】:
                              - (id)initWithCoder:(NSCoder *)aDecoder
                              {
                                  self = [super initWithCoder:aDecoder];
                                  if (self) {
                                      // Custom initialization
                                      self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
                              
                                  }
                                  return self; 
                              }
                              

                              就像 Kyle Begeman 所做的那样,您将上面的代码添加到您的根视图控制器中。所有子视图控制器都将被应用。此外,将其添加到 initWithCoder: 方法中,您可以将样式应用于 xib、情节提要或基于代码的方法中的根视图控制器。

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2013-03-18
                                • 2014-06-01
                                • 2020-11-23
                                • 1970-01-01
                                • 2020-01-07
                                • 2018-07-27
                                • 1970-01-01
                                相关资源
                                最近更新 更多