以编程方式在导航栏中的UIBarButtonItem?

Rah*_*ane 117 uibarbuttonitem navigationbar ios swift

我一直在寻找这个解决方案一段时间但没有得到任何解决方案.例如一个解决方案是

 self.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Stop, target: self, action: nil), animated: true)
Run Code Online (Sandbox Code Playgroud)

此代码将添加一个带有"停止"图像的按钮.就像这样,还有其他解决方案"搜索",刷新"等等.但是,如果我想以编程方式添加按钮,我想要的图像呢?

EI *_*2.0 318

不设置按钮框的自定义按钮图像:

您可以使用init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)指定的图像和其他属性初始化新项目.

let button1 = UIBarButtonItem(image: UIImage(named: "imagename"), style: .plain, target: self, action: Selector("action")) // action:#selector(Class.MethodName) for swift 3
self.navigationItem.rightBarButtonItem  = button1
Run Code Online (Sandbox Code Playgroud)

检查此Apple Doc.参考


UIBarButtonItem使用按钮框架自定义按钮图像

对于 Swift 3.0

    let btn1 = UIButton(type: .custom)
    btn1.setImage(UIImage(named: "imagename"), for: .normal)
    btn1.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    btn1.addTarget(self, action: #selector(Class.Methodname), for: .touchUpInside)
    let item1 = UIBarButtonItem(customView: btn1)

    let btn2 = UIButton(type: .custom)
    btn2.setImage(UIImage(named: "imagename"), for: .normal)
    btn2.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    btn2.addTarget(self, action: #selector(Class.MethodName), for: .touchUpInside)
    let item2 = UIBarButtonItem(customView: btn2)  

    self.navigationItem.setRightBarButtonItems([item1,item2], animated: true)
Run Code Online (Sandbox Code Playgroud)

为了Swift 2.0更老

let btnName = UIButton()
btnName.setImage(UIImage(named: "imagename"), forState: .Normal)
btnName.frame = CGRectMake(0, 0, 30, 30)
btnName.addTarget(self, action: Selector("action"), forControlEvents: .TouchUpInside)

//.... Set Right/Left Bar Button item
let rightBarButton = UIBarButtonItem()
rightBarButton.customView = btnName
self.navigationItem.rightBarButtonItem = rightBarButton
Run Code Online (Sandbox Code Playgroud)

或者只是使用init(customView :)之类的

 let rightBarButton = UIBarButtonItem(customView: btnName)
 self.navigationItem.rightBarButtonItem = rightBarButton
Run Code Online (Sandbox Code Playgroud)

对于System UIBarButtonItem

let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: Selector("btnOpenCamera"))
self.navigationItem.rightBarButtonItem = camera
Run Code Online (Sandbox Code Playgroud)

设置超过1个项目使用rightBarButtonItems或左侧leftBarButtonItems

let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
let item1 = UIBarButtonItem()
item1.customView = btn1

let btn2 = UIButton()
btn2.setImage(UIImage(named: "img2"), forState: .Normal)
btn2.frame = CGRectMake(0, 0, 30, 30)
btn2.addTarget(self, action: Selector("action2:"), forControlEvents: .TouchUpInside)
let item2 = UIBarButtonItem()
item2.customView = btn2

self.navigationItem.rightBarButtonItems = [item1,item2]
Run Code Online (Sandbox Code Playgroud)

使用setLeftBarButtonItemsetRightBarButtonItem

let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: btn1), animated: true);
Run Code Online (Sandbox Code Playgroud)

对于swift> = 2.2,动作应该是#selector(Class.MethodName)...例如btnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)


Jay*_*ayu 25

使用Swift 4或更容易Swift 4.2

在您的ViewDidLoad方法中,定义您的按钮并将其添加到导航栏.

override func viewDidLoad() {
    super.viewDidLoad()

    let logoutBarButtonItem = UIBarButtonItem(title: "Logout", style: .done, target: self, action: #selector(logoutUser))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem

}
Run Code Online (Sandbox Code Playgroud)

那么你需要定义你在action参数中提到的函数,如下所示

@objc func logoutUser(){
     print("clicked")
}
Run Code Online (Sandbox Code Playgroud)

您需要添加@objc前缀,因为它仍在使用遗留内容(目标C).


Leo*_*Leo 17

只需UIBarButtonItem使用customView进行设置

例如:

  var leftNavBarButton = UIBarButtonItem(customView:yourButton)
  self.navigationItem.leftBarButtonItem = leftNavBarButton
Run Code Online (Sandbox Code Playgroud)

或使用setFunction:

  self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);
Run Code Online (Sandbox Code Playgroud)

  • 我对你的答案进行投票,因为你的代码也有效,但 Bhavin 的代码是一次性解决方案,所以我会接受他的答案。感谢伙伴的贡献:) (3认同)

tec*_*242 11

我只是偶然发现了这个问题,这里是Swift 3和iOS 10的更新:

let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: nil)
self.navigationItem.rightBarButtonItem  = testUIBarButtonItem
Run Code Online (Sandbox Code Playgroud)

它肯定比使用所有属性创建UIButton然后随后将customView添加到UIBarButtonItem快得多.

如果您想将图像的颜色从默认的蓝色更改为例如白色,您可以随时更改色调颜色:

test.tintColor = UIColor.white()
Run Code Online (Sandbox Code Playgroud)

PS你应该明显改变你的应用程序的选择器等:)


小智 7

适用于 Swift 5+

let searchBarButtonItem = UIBarButtonItem(image: UIImage(named: "searchIcon"), style: .plain, target: self, action: #selector(onSearchButtonClicked))
        self.navigationItem.rightBarButtonItem  = searchBarButtonItem

@objc func onSearchButtonClicked(_ sender: Any){
    print("SearchButtonClicked")
}
Run Code Online (Sandbox Code Playgroud)


Kus*_*tha 6

在快捷键3中执行操作:

let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: #selector(ViewController.clickButton))
self.navigationItem.rightBarButtonItem  = testUIBarButtonItem

func clickButton(){
        print("button click")
    }
Run Code Online (Sandbox Code Playgroud)