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 向导航栏添加右键的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将约束添加到导航栏 Swift

如何在 Swift 中为导航栏添加阴影并隐藏边框?

在导航栏中自动添加“返回”按钮

在 rootView Swift 3.0 之后以编程方式在 ViewControllers 添加栏按钮项

如何在导航栏中添加右键?

swift 4中无法更改导航栏的高度