如何在 swift 3 中以编程方式为 barButtonItem 设置操作?

Posted

技术标签:

【中文标题】如何在 swift 3 中以编程方式为 barButtonItem 设置操作?【英文标题】:How to programmatically set action for barButtonItem in swift 3? 【发布时间】:2017-02-07 16:17:48 【问题描述】:

这是我之前使用的,

var barButtonItem = UIBarButtonItem(image: backImgs, style: UIBarButtonItemStyle.plain, target: self, action: Selector("menuButtonTapped:"))

但是 Swift 3 有一些语法变化。

【问题讨论】:

【参考方案1】:

例如:-

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))

【讨论】:

谢谢!它节省了我的时间。 我会点击向上的箭头,但它在 69,所以我们暂时不用。 @JackDerbis ???【参考方案2】:

总结 Swift 3 中最常用的方法,用于向 barButton 添加操作。

    带文字的条形按钮

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))
    

    带有您自己的图像的 BarButton

    navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named:"add"), style: .plain, target: self, action: #selector(addTapped))
    

    带有系统图像的BarButton

    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
    

【讨论】:

【参考方案3】:

如果有人在使用customView

barButtonItem.customView?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onBarButtonItemClicked)))

【讨论】:

如果您需要在使用 customView 初始化程序时将手势识别器添加到条形按钮项,这将起作用。据我发现只有这个方法签名会起作用(将手势添加到视图本身/添加到栏按钮/其他任何东西都对我不起作用)。【参考方案4】:

从 Swift 3 开始,您只需要更改 selector 语法,您需要在函数调用中指定方法的第一个参数名称,因此请像这样更改您的选择器。

#selector(menuButtonTapped(sender:))

而且你的方法应该是这样的。

func menuButtonTapped(sender: UIBarButtonItem) 


【讨论】:

从 swift 3 开始,我必须指定第一个参数,但我不需要这样做.. 无论如何,谢谢 @Bhanupriya 是的,您可以,但为此您需要将_ 与选择器#selector(menuButtonTapped(_:)) 一起使用,并且还需要将_ 作为第一个参数添加到您的方法中,例如func menuButtonTapped(_ sender: UIBarButtonItem) 中的任何一个您必须使用其他选项,否则它将不起作用。 @Bhanupriya 你得到我在上面评论中告诉你的关于选择器的内容了吗? 不,我不需要。我需要如下: var barButtonItem = UIBarButtonItem(image: backImgs, style: .plain, target: self, action: #selector(menuButtonTapped)) @Bhanupriya 那么为什么你以前在这里尝试Selector("menuButtonTapped:") : 意味着方法包含一个参数,这就是我以这种方式给出答案的原因。【参考方案5】:

Swift 3 for ios 10.1 上的一行代码:

navigationController?.navigationBar.topItem?.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: nil)

【讨论】:

【参考方案6】:
let barButtonItem = UIBarButtonItem(image: UIImage(named: "backImgs"),
                                            style: .plain,
                                            target: self,
                                            action: #selector(menuButtonTapped))

// Adding button to navigation bar (rightBarButtonItem or leftBarButtonItem)
self.navigationItem.rightBarButtonItem = barButtonItem

 // Private action
@objc fileprivate func menuButtonTapped()  // body method here 

【讨论】:

【参考方案7】:

如果有人正在寻找在现有按钮上设置操作的方法 (Swift 5):

if let leftBarButtonItem = navigationItem.leftBarButtonItem 
    leftBarButtonItem.target = self
    leftBarButtonItem.action = #selector(onBack(_:))



@IBAction func onBack(_ sender: AnyObject) 
    _ = navigationController?.popViewController(animated: true)

【讨论】:

太棒了。它也适用于 Swift 4 及更低版本。【参考方案8】:

为 barbutton 项创建扩展。

 extension UINavigationItem 
    func addSettingButtonOnRight()
       let button = UIButton(type: .Custom)
       button.setTitle("setting", forState: .Normal)
       button.titleLabel?.font = UIFont.systemFontOfSize(15.0)
       button.layer.cornerRadius = 5
       button.backgroundColor = UIColor.grayColor()
       button.frame = CGRect(x: 0, y: 0, width: 100, height: 25)
       button.addTarget(self, action: #selector(gotSettingPage), forControlEvents: UIControlEvents.TouchUpInside)
       let barButton = UIBarButtonItem(customView: button)

       self.rightBarButtonItem = barButton
   

   func gotSettingPage()

   
 

并从 viewDidLoad() 调用它

 self.navigationItem.addSettingButtonOnRight()

【讨论】:

【参考方案9】:

Swift 3 中,您可以像这样添加 UIBarButtonItem,

let addButton = UIBarButtonItem(image:UIImage(named:"your_icon_name"), style:.plain, target:self, action:#selector(YourControllerName.buttonAction(_:)))
addButton.tintColor = UIColor.white
self.navigationItem.rightBarButtonItem = addButton

然后像这样处理按钮动作,

func buttonAction(_ sender: UIBarButtonItem) 


希望对你有帮助。

【讨论】:

【参考方案10】:

对于 Swift 4 添加 viewDidLoad:

navigationItem.rightBarButtonItem = UIBarButtonItem(
    barButtonSystemItem: UIBarButtonSystemItem.add, 
    target: self, 
    action: #selector(addTransaction)
)

【讨论】:

【参考方案11】:

在 Swift 5 中

//For righter button item
let rightBtn = UIBarButtonItem(image: UIImage(named: "rightmenu"), style: .plain, target: self, action: #selector(onClickMethod))//Change your function name and image name here
self.navigationItem.rightBarButtonItem = rightBtn
//self.navigationItem.rightBarButtonItem = [rightBtn, anotherBtn] //If you want to add more buttons add like this

//For left bar button item
let leftBtn = UIBarButtonItem(image: UIImage(named: "rightmenu"), style: .plain, target: self, action: #selector(onClickMethod)) //Change your function name and image name here
self.navigationItem.leftItemsSupplementBackButton = true
self.navigationItem.leftBarButtonItem = leftBtn
//self.navigationItem.leftBarButtonItems = [leftBtn, anotherBtn] //If you want to add more buttons add like this

//This is your function name
@objc func onClickMethod() 
    print("Left bar button item")

【讨论】:

【参考方案12】:

制作一个 UIBarButtonItem:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(LocationViewController.doneButtonClicked(_:)))

添加到 NavigationItem:

self.navigationItem.rightBarButtonItem = rightButton

相关功能:

func doneButtonClicked(_ button:UIBarButtonItem!)    
    print("Done clicked")    

【讨论】:

以上是关于如何在 swift 3 中以编程方式为 barButtonItem 设置操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中以编程方式将 UILabel 对象居中?

如何在 Swift 中以编程方式更改 UICollectionViewCell 大小?

如何在 ios swift 中以编程方式创建自动布局等宽约束?

在 iOS Swift 3 中以编程方式添加 Web 视图时如何在 UIWebView 中获取响应状态代码?

如何使用 Swift 在 iOS 中以编程方式进行 segue

如何在ios swift中以编程方式创建自动布局等宽度约束?