ios - 以编程方式添加到导航栏的 UIBarButtonItem 无法调用选择器,而添加到工具栏的按钮却可以

标签 ios swift uinavigationcontroller uibarbuttonitem

我有一个有点令人困惑的问题。在我的应用程序中,我有一个工具栏,可以以编程方式换出按钮并正确调用关联的选择器。但是,当我将相同的技术应用于导航栏上的按钮时,它无法调用选择器。以下示例代码包含 2 组按钮(一组用于导航,一组用于工具栏)。尽管完全相同,但导航栏按钮上的选择器从未被调用。

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var toolbar: UIToolbar!

    let navCancelButton = UIBarButtonItem(barButtonSystemItem: .cancel,
                                          target: self,
                                          action: #selector(toggleDelete))
    let navTrashButton = UIBarButtonItem(barButtonSystemItem: .trash,
                                         target: self,
                                         action: #selector(toggleDelete))

    let toolbarCancelButton = UIBarButtonItem(barButtonSystemItem: .cancel,
                                              target: self,
                                              action: #selector(toggleDelete))
    let toolbarTrashButton = UIBarButtonItem(barButtonSystemItem: .trash,
                                             target: self,
                                             action: #selector(toggleDelete))

    var isDeleting = false {
        didSet {
            navigationItem.rightBarButtonItem = isDeleting ? navCancelButton : navTrashButton
            toolbar.items = isDeleting ? [toolbarCancelButton] : [toolbarTrashButton]
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        isDeleting = false
    }

    @objc func toggleDelete() {
        isDeleting = !isDeleting
    }
}

这显示了之前的代码:

enter image description here

最佳答案

导航栏中的按钮似乎失去了目标。因此,您可以像这样在 viewDidLoad 中设置目标:

self.navTrashButton.target = self
self.navCancelButton.target = self

或者我要做的就是像这样将变量放在类作用域中:

var navCancelButton: UIBarButtonItem!
var navTrashButton: UIBarButtonItem!

然后像这样在 viewDidLoad 中创建它们:

navCancelButton = UIBarButtonItem(barButtonSystemItem: .cancel,
                                  target: self,
                                  action: #selector(toggleDelete))
navTrashButton = UIBarButtonItem(barButtonSystemItem: .trash,
                                 target: self,
                                 action: #selector(toggleDelete))

这样你就知道按钮是在 View Controller 期望它们准备就绪时创建的。

关于ios - 以编程方式添加到导航栏的 UIBarButtonItem 无法调用选择器,而添加到工具栏的按钮却可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47932513/

相关文章:

swift - 尝试添加要解析的类时出现“架构类名称不重新验证”错误

swift - 我无法在 Swift 3 的 navigationController 中执行我的 segue

ios - 为什么 DetailViewController 会弹出到带有选项卡栏和导航 Controller 的第一个 DetailViewController?

ios - 如何从 MenuScene 中的 SKNode Button 调用排行榜

objective-c - 将 UIViewController 的 View 添加到另一个 UIViewController 的 View 是否可取?

swift - 变量中的变量

swift - 为什么这个 swiftUI 矩形向右移动?

ios - 如何在 ios 中的 UIPickerview 上添加搜索选项?

android - 在我的应用程序中使用指纹默认硬件 android 登录,与(paytm Money 和 Gpay、imobile、axis Bank)相同

ios - 以编程方式从编辑器获取导航 Controller > 嵌入 > 导航 Controller