【问题标题】:How to add multiple UIBarButtonItems on right side of Navigation Bar?如何在导航栏右侧添加多个 UIBarButtonItem?
【发布时间】:2015-08-01 04:54:09
【问题描述】:

我想在我的UINavigationBar 右侧有多个UIBarButtonItem。我怎样才能做到这一点?

我正在尝试的一个示例如下所示 - 您可以注意到右上角有多个按钮。

【问题讨论】:

标签: ios uinavigationbar uibarbuttonitem


【解决方案1】:

在 swift 中使用它:

override func viewDidLoad() {
  super.viewDidLoad()

  let editImage    = UIImage(named: "plus")!
  let searchImage  = UIImage(named: "search")!

  let editButton   = UIBarButtonItem(image: editImage,  style: .Plain, target: self, action: "didTapEditButton:")
  let searchButton = UIBarButtonItem(image: searchImage,  style: .Plain, target: self, action: "didTapSearchButton:")

  navigationItem.rightBarButtonItems = [editButton, searchButton]
}

像这样编写动作函数:

func didTapEditButton(sender: AnyObject){
    ...
}

func didTapSearchButton(sender: AnyObject){
    ...
}

Swift 4 和 5

    override func viewDidLoad() {
        super.viewDidLoad()
        let editImage    = UIImage(named: "edit")!
        let searchImage  = UIImage(named: "search")!

        let editButton   = UIBarButtonItem(image: editImage,  style: .plain, target: self, action: #selector(didTapEditButton(sender:)))
        let searchButton = UIBarButtonItem(image: searchImage,  style: .plain, target: self, action: #selector(didTapSearchButton(sender:)))

        navigationItem.rightBarButtonItems = [editButton, searchButton]
    }

    @objc func didTapEditButton(sender: AnyObject){

    }

    @objc func didTapSearchButton(sender: AnyObject){

    }

【讨论】:

  • 将此标记为答案,因为这是 swift 中唯一的答案,但非常感谢所有回答的人。
  • 出现错误:上下文类型 'UIBarButtonItem' 不能与数组文字一起使用
  • @Profstyle 你得到解决方案了吗?
  • 我们可以为此更改色调吗?
【解决方案2】:
-(void)viewDidLoad{

    UIBarButtonItem *anotherButton1 = [[UIBarButtonItem alloc] initWithTitle:@"Button_1" style:UIBarButtonItemStylePlain target:self action:@selector(button_1:)];

    UIBarButtonItem *anotherButton2 = [[UIBarButtonItem alloc] initWithTitle:@"Button_" style:UIBarButtonItemStylePlain target:self action:@selector(button_2:)];

    self.navigationItem.rightBarButtonItems=@[anotherButton1,anotherButton2];
}

【讨论】:

    【解决方案3】:

    在 Swift 3 中,您可以使用:

    let editImage   = UIImage(named: "plus")!
    let searchImage = UIImage(named: "search")!
    
    let editButton   = UIBarButtonItem(image: editImage,  style: .plain, target: self, action: #selector(didTapEditButton))
    let searchButton = UIBarButtonItem(image: searchImage,  style: .plain, target: self, action: #selector(didTapSearchButton))
    
    navigationItem.rightBarButtonItems = [editButton, searchButton]
    

    【讨论】:

      【解决方案4】:

      我认为以上都行不通

      试试这个

      var burgerItem = UIBarButtonItem(image: UIImage(named:"categories"), style: .Plain, target: self, action: "categories")
              var weatherItem = UIBarButtonItem(title: "Weather", style: .Plain, target: self, action: "weather")
      
      
              burgerItem.tintColor = UIColor.whiteColor()
              weatherItem.tintColor = UIColor.whiteColor()
      
              navigationItem.setRightBarButtonItems([burgerItem,weatherItem], animated: true)
      

      您必须使用 navigationItem.setRightBarButtonItems 并小心。 navigationItem 必须是视图控制器。

      class testViewController:UIViewController {
      
      ovverride func viewDidLoad() {
          self.navigationItem.setRightBarButtonItems(...
      
      }
      
      }
      

      【讨论】:

        【解决方案5】:

        只需添加以下代码:

        self.navigationItem.leftBarButtonItem = nil
        
        let button = UIButton(type: .custom)
        button.setImage(UIImage (named: "ChatTab"), for: .normal)
        button.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0)
        //button.addTarget(target, action: nil, for: .touchUpInside)
        let barButtonItem = UIBarButtonItem(customView: button)
        
        let button2 = UIButton(type: .custom)
        button2.setImage(UIImage (named: "ActivityTab"), for: .normal)
        button2.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0)
        //button.addTarget(target, action: nil, for: .touchUpInside)
        
        let barButtonItem2 = UIBarButtonItem(customView: button2)
        self.navigationItem.rightBarButtonItems = [barButtonItem, barButtonItem2]
        

        这是结果:

        【讨论】:

          【解决方案6】:

          使用 Swift 4

          let editImage       = UIImage(named: "toolbar_edit")!
          let favoriteImage   = UIImage(named: "toolbar_fav_solid")!
          
          let editButton      = UIBarButtonItem(image: editImage,  style: .plain, target: self, action: #selector(didTapEditButton))
          let favoriteButton  = UIBarButtonItem(image: favoriteImage,  style: .plain, target: self, action: #selector(didTapFavoriteButton))
          
          navigationItem.rightBarButtonItems = [editButton, favoriteButton]
          

          这些按钮的点击操作

          @objc func didTapEditButton(sender: AnyObject) {
              print("edit")
          }
          
          @objc func didTapFavoriteButton(sender: AnyObject) {
              print("favorite")
          }
          

          输出截图(iPhone X)

          【讨论】:

          【解决方案7】:

          接受的答案以及少数答案是绝对正确的,但就我而言,它们都不起作用。

          原因:我的视图控制器是从 UIViewController 继承的,我必须在右侧设置添加到购物车按钮和搜索按钮。我所有的视图控制器都是 UITabbarController 的一部分。

              let editImage = UIImage(named: "OrdersTabIcon")
              let searchImage = UIImage(named: "OrdersTabIcon")
              let editButton = UIBarButtonItem(image: editImage, style: .plain, target: self, action: #selector(iconTapped))
              let searchButton = UIBarButtonItem(image: searchImage, style: .plain, target: self, action: #selector(iconTapped))
          

          而不是使用

           self.navigationItem.setRightBarButtonItems([editButton, searchButton], animated: true)
          

          使用这个。

          self.navigationController?.navigationBar.topItem?.setRightBarButtonItems([editButton, searchButton], animated: true)
          

          【讨论】:

            【解决方案8】:

            这可能对你有帮助

            - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
            
                self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
                if (self) {
                    self.navigationItem.title = @"Title";
                    UIBarButtonItem *logOutButton = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStylePlain target:self action:@selector(ButtonClickedAtIndex1:)];
                    [logOutButton setTintColor:[UIColor blackColor]];
                    logOutButton.tag = 1;
            
                    UIBarButtonItem *syncBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Sync" style:UIBarButtonItemStylePlain target:self action:@selector(ButtonClickedAtIndex1:)];
                    [syncBarButtonItem setTintColor:[UIColor blackColor]];
                    syncBarButtonItem.tag = 2;
            
                    self.navigationItem.leftBarButtonItem = logOutButton;
                    self.navigationItem.rightBarButtonItem = syncBarButtonItem;
            
                   float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
            
                   if (systemVersion >= 7.0) {
                       self.edgesForExtendedLayout = UIRectEdgeNone;
                       self.navigationController.navigationBar.translucent = NO;
                   }
                }
                return self;
            }
            

            【讨论】:

            • OP 要求在同一侧提供两个按钮。
            【解决方案9】:

            使用navigationItem 的rightBarButtonItems,它接受UIBarButton 的数组。 Appledoc

            let share = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareTapped))
            let add = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
            navigationItem.rightBarButtonItems = [add, share]
            

            【讨论】:

            • 请始终将您的答案放在上下文中,而不仅仅是粘贴代码。有关详细信息,请参阅here
            • 不鼓励仅使用代码的答案。请单击edit 并添加一些词来总结您的代码如何解决问题,或者解释您的答案与之前的答案/答案有何不同。 From Review
            【解决方案10】:

            我不知道以前是否无法使用 Interface Builder 解决方案,但至少在最近的更新(Xcode 11.0)中,可以将两个 UI Bar Buttons 拖到 rightBarButton 空间中。然后可以像往常一样将两个出口和动作拖到代码中。

            由于 OP 没有要求没有 IB 的解决方案,我认为这也可以作为答案。

            【讨论】:

              【解决方案11】:

              对于带有新更新的 Xamarin iOS,如下所示:

              UIBarButtonItem Button1 = new UIBarButtonItem(UIImage.FromBundle("Image1"), UIBarButtonItemStyle.Plain,YourEventHandler);
              UIBarButtonItem Button2 = new UIBarButtonItem(UIImage.FromBundle("Image1"), UIBarButtonItemStyle.Plain,YourEventHandler);
              
              NavigationItem.SetRightBarButtonItems(new[]{ Button1, Button2 }, true);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-13
                • 2013-10-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-04
                相关资源
                最近更新 更多