swift - 从 viewDidLoad 外部修改 IBOutlet 属性 - Xcode Storyboards
问题描述
我有一个单独的类,当调用它时,它会通过其 IBOutlet 更新活塞视图控制器中的 NSButton 的工具提示(文本属性)。但是,每当我尝试执行该操作时,我都会收到错误消息
“在隐式展开可选值时意外发现 nil”
由于pistonViewController.piston.tooltip
没有用,我在类上方创建了一个实例:
let pistonView = pistonViewController();
然后从名为的单独类中pistonView.set_piston();
func set_piston(index: Int) {
piston1.toolTip = "yay it worked!";
}
我得到同样的错误:发现为零。
如何获得正确的活塞视图控制器实例(出现在 viewDidLoad 上的那个),这样活塞 1 就不会为零?
有这个解决方案,但它看起来不必要的复杂。这个似乎只适用于 iOS,使用在 MacOS 上不起作用的 storyboard.InstantiateViewController 命令。这个 MacOS 解决方案解释得不好,似乎不起作用。
解决方案
“[如何] 从 viewDidLoad 外部修改 IBOutlet 属性”
(但您真正要问的是如何从视图控制器外部修改视图控制器的视图。)
简短的回答是“不要那样做”。它违反了封装原则。您应该将视图控制器的视图属性视为私有的,并且只能在视图控制器的代码中修改它们。
(错误地引用格劳乔·马克思的话:“医生,当我这样做时它崩溃了”。“那就不要那样做!”)
相反,在 PistonViewController 中添加一个公共属性 ( pistonToolTip
)(类名应以大写字母开头)。
class PistonViewController: UIViewController {
var pistonToolTip: String {
didSet {
piston?.tooltip = pistonToolTip
}
}
}
如果您在PistonViewController
加载视图之前设置了活塞工具提示,请将此行添加到 viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
piston?.tooltip = pistonToolTip
// The rest of your viewDidLoad code
}
推荐阅读
- python - apps.py中的django-rq配置和安装
- php - 如何在不损失质量的情况下裁剪图像?
- python - 为什么 sklearn 随机森林需要相同的时间来预测一个样本而不是 n 个样本
- android - Android minifyEnabled true for firebase
- search - PixelSearch 偶尔找不到 PixelGetColor 找到的颜色
- python - 如何按子列表的第一项然后按第三项对列表列表进行排序
- sharepoint - Sharepoint 在线:以编程方式发布到新闻源
- python - 在 Python 中读取 RTF - PyRTF
- google-sheets - 方法电子表格.batchUpdate 不适用于 API 密钥
- python - Python:比较 CSV 文件并保存与第一行的差异(列名)