Swift 3.0 向导航栏添加右键
Posted
技术标签:
【中文标题】Swift 3.0 向导航栏添加右键【英文标题】:Swift 3.0 Adding a Right Button to Navigation Bar 【发布时间】:2017-12-17 13:52:21 【问题描述】:我在视图控制器的顶部添加了一个导航栏。我正在尝试根据条件控制按钮是否可见,但我无法添加按钮。目前为止,
var addButton: UIBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))
override func viewDidLoad()
super.viewDidLoad()
let boool = true
if boool
self.navigationItem.rightBarButtonItem = self.addButton
else
self.navigationItem.rightBarButtonItem = nil
func addTapped(sender: AnyObject)
print("hjxdbsdhjbv")
我认为它不能正常工作,因为我在 VC 中添加了一个导航栏,而不是使用导航控制器并在那里使用该栏。我想知道是否有办法使用这个导航栏。
【问题讨论】:
您确定self.addButton
指向实际的UIBarButtonItem
并且不是零吗?它是如何设置的?
我认为你必须先初始化你的 self.addButton,然后
将这一行 var addButton: UIBarButtonItem!
更改为这一行 var addButton: UIBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(self.yourselector))
我已经编辑了我的问题以反映更改,但在加载时,右侧仍然没有按钮。
【参考方案1】:
这很简单。把这行代码放到viewDidLoad
:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "test", style: .done, target: self, action: #selector(addTapped))
为 Swift 4 更新 或更高版本:
自定义函数:
@objc func action(sender: UIBarButtonItem)
// Function body goes here
(自定义)右栏按钮项:
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))
(自定义)左栏按钮项:
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(title: "some_text", style: .done, target: self, action: #selector(self.action(sender:)))
您还可以添加系统栏按钮项目,如下所示:UIBarButtonItem.SystemItem
为栏按钮项目定义系统提供的图像:.add、.done、.cancel、.edit、.save、 .compose、.reply、.organize 等等。
(系统)右栏按钮项:
self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))
(系统)左栏按钮项:
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.action(sender:)))
【讨论】:
适用于 Swift 4 非常感谢,但为什么?【参考方案2】:let rightBarButtonItem = UIBarButtonItem.init(image: UIImage(named: "EditImage"), style: .done, target: self, action: #selector(ViewController.call_Method))
self.navigationItem.rightBarButtonItem = rightBarButtonItem
【讨论】:
@Devbot10 如果您认为该问题因任何原因有任何缺陷,您必须发表评论,而不是尝试编辑其他人的答案。【参考方案3】:您说您通过情节提要向视图控制器添加了UINavigationBar
,但查看您提供的代码,在 IB 中没有与导航栏的出口连接。
为了访问self.navigationItem
,您的视图控制器必须嵌入在UINavigationController
中,或者是层次结构的一部分。除非您需要在单个视图控制器上使用自定义导航栏,否则我建议将其从 Interface Builder 中删除,然后确保有问题的视图控制器嵌入在 UINavigationController
中,或者将其推送到导航堆栈中另一个嵌入在导航控制器中的控制器,然后您应该会看到您的UIBarButtonItem
。
【讨论】:
在自定义导航栏上使用嵌入式 UINavigationController 有什么好处? 将视图控制器嵌入导航控制器允许您在界面构建器中拥有清晰布局的导航堆栈,并且对于该导航堆栈中的每个视图控制器,您都可以访问相同的导航栏。相反,您将一个导航栏添加到视图控制器,然后您必须将另一个导航栏添加到下一个视图控制器,同时单独管理每个导航栏。【参考方案4】:首先,您需要将导航栏连接到 IBOutlet,以便您可以在代码中引用它。之后,这段代码应该可以工作了:
let navigationItem = UINavigationItem(title: "Title")
navigationItem.rightBarButtonItem = self.addButton
navigationItem.hidesBackButton = true
self.navigationBar.pushItem(navigationItem, animated: false)
【讨论】:
这个导航控制器确实有一个后退按钮。我添加了@IBOutlet weak var navigationBar: UINavigationBar!与您的代码一起,但通过点击后退按钮,它只会删除导航栏并显示下面的内容。这有点难以解释,但你知道我在说什么吗? 返回的视图控制器需要有自己的 UINavigationBar。这就是为什么最好使用 UINavigationController。【参考方案5】:斯威夫特 4.2;
添加viewController
override func viewDidLoad()
super.viewDidLoad()
self.addNavigationBarButton(imageName: "ic_back", direction:.left)
添加 Class
您的 API 或实用程序类
public func addNavigationBarButton(imageName:String,direction:direction)
var image = UIImage(named: imageName)
image = image?.withRenderingMode(.alwaysOriginal)
switch direction
case .left:
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
case .right:
self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style:.plain, target: nil, action: #selector(goBack))
@objc public func goBack()
self.navigationController?.popViewController(animated: true)
public enum direction
case right
case left
【讨论】:
【参考方案6】:在 Xcode 10.2、swift 5.0 中测试; 首先,我在 IB 的 UINavigationController 中嵌入了 ViewController。 然后在 ViewDidLoad 中包含这些行
self.title = "orange"
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(changeLayout)).
注意 - 通过导航控制器访问标题或添加按钮不起作用。例如:设置标题 - Self.navigationcontroller.navigationItem.title 不起作用,
【讨论】:
以上是关于Swift 3.0 向导航栏添加右键的主要内容,如果未能解决你的问题,请参考以下文章