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