swift - 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
}
}
解决方案
正如您所发现的,这条线出现的地方有很大的不同:
let barButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settings"),
style: .plain, target: self, action: #selector(presentSettings))
问题是target:self
部分。当条形按钮项被配置为实例属性初始化程序(您的第一个示例)的一部分时,该实例尚不存在 - 这是我们正在初始化的。所以self
没有任何意义,按钮以 no 结尾target
。因此,点击按钮什么也不做。
(实际上,技术性很强,self
就是类,但知道这不是一件有用的事情。)
在您的第二个示例中,该行是 的一部分viewDidLoad
,它在视图控制器实例存在并已初始化后大量运行。viewDidLoad
实际上是一个实例方法。self
正如您所期望的那样,实例也是如此。
推荐阅读
- python - Python:退出代码的后台计时器(在 Windows 上)
- teradata - 如何在 Teradata 中返回前 7 天
- python - 在 GCP Dataflow SDK 2.25.0 中运行 Python 脚本 - 来自工作人员的错误消息:SDK 声称已处理 xxxx 但应该已处理 yyyy 元素
- javascript - 如何用 gatsby 保持 redux 状态?
- python - 如果在脚本或 python 上使用,蓝牙 BLE Gatttool 无法重复执行,但如果手动使用它可以正常工作。(树莓派 4)
- c - 管道标准输出到其他程序标准输入失败;没有消息通过管道
- sql - MySQL:创建求和列的查询,同时从其他表中收集信息
- r - R:将行数据框中的值除以该行中的最大值
- d3.js - d3 的进口破坏了出口
- pdf - 在 Adobe Acrobat Javascript 中,如何在脚本的某个部分作用于页面之前强制页面变为“可编辑”?