gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:51:06 26 4
gpt4 key购买 nike

我的导航右侧有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com