swift - UIBarButtonItem 在作为属性创建时不起作用,但在函数中创建时起作用

标签 swift

我的导航右侧有一个 UIBarButtonItem,它有一个齿轮图像并显示我的设置 View Controller 。当我在 setupNavigationBar() 中创建按钮时,我可以让它正常工作,但如果我将按钮创建为属性,它就不起作用。我无法理解这两种情况会有什么不同。按钮在两种情况下都存在,但功能却没有。

这个版本不工作

class DecksController: UIViewController {

    let settingsBarButton: UIBarButtonItem = {
        let barButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settings"), style: .plain, target: self, action: #selector(presentSettings))
        return barButton
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationBar()
    }

    @objc func presentSettings() {
        let settingsController = SettingsController()
        self.navigationController?.pushViewController(settingsController, animated: true)
    }

    func setupNavigationBar() {
        self.navigationItem.rightBarButtonItem = settingsBarButton
    }
}

这个版本确实有效

class DecksController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationBar()
    }

    @objc func presentSettings() {
        let settingsController = SettingsController()
        self.navigationController?.pushViewController(settingsController, animated: true)
    }

    func setupNavigationBar() {
        let settingsBarButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settings"), style: .plain, target: self, action: #selector(presentSettings))
        self.navigationItem.rightBarButtonItem = settingsBarButton
    }
}

最佳答案

正如您所发现的,这条线出现的地方有很大的不同:

let barButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settings"), 
    style: .plain, target: self, action: #selector(presentSettings))

问题出在 target:self 部分。当条形按钮项被配置为实例属性初始值设定项的一部分(您的第一个示例)时,该实例尚不存在——这是我们正在初始化的。所以 self 没有意义,按钮最终没有 target。因此,点击按钮不会执行任何操作。

(实际上,从技术上讲,self 是类,但知道这没有什么用。)

在您的第二个示例中,该行是 viewDidLoad 的一部分,它在 View Controller 实例出现并初始化后 运行相当长的时间。 viewDidLoad 实际上是一个实例方法。所以 self 是实例,如您所料。

关于swift - UIBarButtonItem 在作为属性创建时不起作用,但在函数中创建时起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56962390/

相关文章:

ios - 获取某些单元格的快照不起作用

ios - swift 头文件中的两种歧义类型

ios - 消息发送到已释放实例 Core Data

ios - 创建具有初始时间和结束时间的时间范围

swift - 如何在 Xcode macOS Cocoa 应用程序中嵌入和流式传输来自网络的视频?

ios - Swift 函数可以只接受一定范围的值吗?

swift - 代码覆盖率是否已经适用于 Swift?

ios - Swift:实例化 View Controller 以在当前导航堆栈中进行自定义转换

json - Swift 4 可编码 : the keys are Int array in JSON data

swift - 我无法快速覆盖从 cocoapods 导入的类的方法