首页 > 解决方案 > UIBarButtonItem 在作为属性创建时不起作用,但在函数中创建时起作用

问题描述

UIBarButtonItem的导航右侧有一个齿轮图像并显示我的设置视图控制器。当我在 中创建按钮时,我可以让它正常工作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
    }
}

标签: swift

解决方案


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

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

问题是target:self部分。当条形按钮项被配置为实例属性初始化程序(您的第一个示例)的一部分时,该实例尚不存在 - 这是我们正在初始化的。所以self没有任何意义,按钮以 no 结尾target。因此,点击按钮什么也不做。

(实际上,技术性很强,self就是类,但知道这不是一件有用的事情。)

在您的第二个示例中,该行是 的一​​部分viewDidLoad,它在视图控制器实例存在并已初始化后大量运行viewDidLoad实际上是一个实例方法。self正如您所期望的那样,实例也是如此。


推荐阅读