首页 > 解决方案 > 从 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 解决方案解释得不好,似乎不起作用。

标签: swiftxcodemacos

解决方案


“[如何] 从 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
}

推荐阅读