【问题标题】:leftbarbuttonitem does not show up in the navigation barleftbarbuttonitem 不显示在导航栏中
【发布时间】:2015-03-17 06:53:33
【问题描述】:

我一直在开发 iOS 应用,但在将图像用作导航栏中的左栏按钮项时遇到了问题。我尝试过以下方式:

UIImage *backButtonImage = [UIImage imageNamed:@"backbuttonCB"];
CGRect buttonFrame = CGRectMake(0, 0, backButtonImage.size.width, backButtonImage.size.height);
UIButton *backButton = [[UIButton alloc] initWithFrame:buttonFrame];
[backButton setImage:backButtonImage forState:UIControlStateNormal];
UIBarButtonItem *backBarButtonItem= [[UIBarButtonItem alloc] initWithCustomView: backButton];
self.navigationItem.leftBarButtonItem = backBarButtonItem;

运行应用程序时,条形按钮似乎永远不会显示。

然后我继续尝试以下其他方法。

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"backbuttonCB"] style:UIBarButtonItemStylePlain target:nil action:@selector(methodname)];

这个方法确实有效。然而,显示的图像被染成蓝色,看起来并不像它本来的样子。更改此图像的色调没有帮助。

知道如何解决这个问题吗?

编辑:如果有帮助,请提供更多信息。 这是导航堆栈中的第一个视图。导航堆栈以模态方式显示,即有一个前一个视图控制器,并且在前一个视图控制器和导航控制器之间有一个模态segue。这是导航堆栈中的第一个视图。

编辑:问题已解决。 我认为这是 xcode 中的一个错误,因为当我重新启动 xcode 并使用实际设备而不是模拟器对其进行测试时,它运行良好。但是,似乎仍然无法在模拟器上运行。

【问题讨论】:

  • 你试过设置按钮的背景图片吗?
  • 你应该将 UIButton 初始化为 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 然后 setFramesetImage
  • 这两种方法都不起作用。
  • 你试过导航栏上的自定义视图吗??
  • 不,我现在就试试。我只是在非模态显示时尝试使用它并且运行良好。所以我认为这与此有关。

标签: ios cocoa-touch uinavigationbar uibarbuttonitem


【解决方案1】:

尝试以这种方式设置您的 leftBarButtonItem。以模态方式呈现时,它不会显示出来。

self.navigationController?.navigationBar.topItem.leftBarButtonItem =

【讨论】:

    【解决方案2】:

    在分配给leftBarButtonItem 之前调用myButton.sizeToFit() 对我有帮助。

        let cancelButton = UIButton()
        cancelButton.backgroundColor = .red
        cancelButton.setTitle("Common/Cancel".localized, for: .normal)
        cancelButton.sizeToFit() //!!!
        let cancelBarButton = UIBarButtonItem(customView: cancelButton)
        navigationItem.leftBarButtonItem = cancelBarButton
    

    【讨论】:

    • 我的 leftBarButtonItem 在 iOS10 及更早版本上没有显示。您的解决方案有效,因为我将 UIEdgeInset 设置为负数(对于 iOS11),这是 iOS10 不喜欢的。谢谢。
    • 当设备是 iPhone 5 尺寸时它对我有帮助,非常感谢!
    • 如何做到“通用/取消”.localized?
    • 这是我对字符串的自定义扩展:extension String { var localized: String { return NSLocalizedString(self, comment: "") }@FrancescoLeoni
    【解决方案3】:

    尝试使用此代码,

    self.navigationItem.hidesBackButton=YES;
    
    UIImage *buttonImage = [UIImage imageNamed:@"Back"];
    UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [aButton setImage:buttonImage forState:UIControlStateNormal];
    aButton.frame = CGRectMake(0.0,0.0,buttonImage.size.width,buttonImage.size.height);
    [aButton addTarget:self action:@selector(backBtnTapped) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:aButton];
    self.navigationItem.leftBarButtonItem = backButton; 
    

    【讨论】:

    • 对我不起作用。我猜它与模态呈现的导航控制器有关。我在问题中添加了更多内容
    【解决方案4】:

    我遇到了同样的问题。要查看按钮,我必须更改 tint 颜色,这是 Swift 中的代码:

    self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(image:UIImage.init(named: "btn_back_default")!, style:UIBarButtonItemStyle.Plain, target: self, action: Selector("back"))
    self.navigationItem.leftBarButtonItem?.tintColor = UIColor.whiteColor()
    

    【讨论】:

      【解决方案5】:

      替换您的代码以将按钮初始化为customType,如下所示:

      UIImage *backButtonImage = [UIImage imageNamed:@"backButtonCB"];
          CGRect buttonFrame = CGRectMake(0, 0, backButtonImage.size.width, backButtonImage.size.height);
          UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
          [backButton setFrame:buttonFrame];
          [backButton setImage:backButtonImage forState:UIControlStateNormal];
          UIBarButtonItem *backBarButtonItem= [[UIBarButtonItem alloc] initWithCustomView: backButton];
          self.navigationItem.leftBarButtonItem = backBarButtonItem;
      

      希望对你有帮助....:)

      【讨论】:

      • 那么先检查你的backButtonImage是否存在?
      • 图片名称正确。就像我说的那样,当我按照第二种方法进行操作时,图像会显示但带有蓝色调。
      • 在第二种方法中,您使用的是@"backbuttonCB",而第一种方法是@"backButtonCB"......"B" 是不同的
      • 实际上,这是堆栈溢出问题中的一个错字。刚刚修好了。
      • 即使你的第一种方法在我的最后也没有任何改变......根据我的说法,你应该更改图像和图像名称
      【解决方案6】:

      向 Views 故事板添加一个 Navigation Item,并在 ViewController 中为其创建一个 outlet。然后,使用您的插座而不是 self.navigationController?.navigationItem 来引用 leftBarButtonItem。

      【讨论】:

        【解决方案7】:

        为 Swift 5 更新:

        let image = UIImage(named: "iconClose")
        let button = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(self.cancel))
        navigationItem.leftBarButtonItem = button
        

        【讨论】:

          【解决方案8】:

          对我来说,iOS 13 上的问题是由于使用原生 Apple SF Symbols 作为 UIBarButtonItem 的图像。

          我的建议是使用将您的图像添加到资产中,或者如果您更喜欢使用 SF 符号,请使用“#available”选择器在版本 > iOS 14.0 中使用它们,请参阅:

          var img: UIImage
          var backButton: UIBarButtonItem
          
          if #available(iOS 14.0, *) {
              img = UIImage(systemName: "chevron.backward")!
              backButton = UIBarButtonItem(image: img, style: .plain, target: self, action: #selector(foo))
          } else {
              // add your image to the project's assets first and make sure that the name is the same
              img = UIImage(named: "my-custom-image")!
              backButton = UIBarButtonItem(image: img, style: .plain, target: self, action: #selector(foo))
          }
          
          self.navigationItem.leftBarButtonItem = backButton
          

          【讨论】:

            猜你喜欢
            • 2018-04-18
            • 1970-01-01
            • 2012-07-06
            • 2023-03-19
            • 1970-01-01
            相关资源
            最近更新 更多