UIView 在子类中作为@IBOutlet,而在超类中是实例属性,而不是出口



我有一个超类,我将UIView实例化为具有红色背景色的属性。在我的子类中,我想覆盖此属性,但将其作为 IBOutlet。这可能吗?因此,我希望我的所有子类都可以通过覆盖超类的视图,在故事板中具有红色背景的视图。我正在尝试将此逻辑实现为更复杂的概念,但我使用 UIView 只是为了简单起见。这是不起作用的代码:

class SuperClass: UIViewController {
lazy var myView: UIView! = {
let aView = UIView()
aView.backgroundColor = .red
return aView
}()
}
class SubclassVC: SuperClass {
@IBOutlet override var myView: UIView! {
get { return super.myView }
set {}
}
}

有什么建议吗?

IBOutlet只是对Interface Builder的一个提示。IBOutlets可以是任何东西。UIView, UIButton, UITextView,

@IBOutlet weak var myView: UIView!

在上面的代码中,myView 只是对情节提要或 XIB 中已创建的视图的引用

IBOutlet的作用:

对象可以通过以下方式与应用程序中的其他对象进行通信 向网点发送消息。插座可以引用 应用程序:用户界面对象,如文本字段和按钮, 模型对象(通常是自定义类的实例(,甚至 应用程序对象本身。插座是特殊的实例变量 因为它们可以在界面生成器中设置。

和:

注意:IBOutlet 是 C 预处理器删除的空定义宏 在编译时。界面生成器使用它来识别插座 声明,以便在连接插座时显示它们 视觉。

总结:

IBOutlets几乎可以引用任何东西。它们只是一个提示 界面生成器,可让您在加载时设置其值 十一。事实上,文本IBOutlet在 界面构建器世界,它从最终产品中剥离 因为它完全无法用于除 帮助界面生成器。

我会回去看看你正在勾搭的其他一些东西 作为IBOutlets,你一定会发现他们确实有一些 真实类型。

相反,您可以尝试以下操作

class SuperClass: UIViewController {
@IBOutlet weak var myView: UIView!{
didSet {
myView.backgroundColor = .red
}
}
}
class SubclassVC: SuperClass {
func updateMyView() {
//Note : You can customise the view and it is available as IBOutlet
myView.backgroundColor = .orange
}
}

使用继承,您可以将插座连接到基类并使用它 在子类中,您可以根据需要更新它

最新更新