我有一个超类,其中我将UIView实例化为具有红色背景色的属性。在我的子类中,我想覆盖此属性,但是将其设置为IBOutlet。那可能吗?因此,我希望我的所有子类都可以通过覆盖超类的视图在Storyboard中以红色背景显示一个视图。我试图将这种逻辑实现为更复杂的概念,但是我只是为了简单起见使用了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 {}
}
}
有什么建议吗?
答案 0 :(得分:0)
IBOutlet
只是对Interface Builder的提示。 IBOutlets可以是任何东西。 UIView, UIButton, UITextView,
等
@IBOutlet weak var myView: UIView!
在上面的代码中,myView只是对情节提要或XIB中已创建的视图的引用
IBOutlet的作用:
一个对象可以通过以下方式与应用程序中的其他对象通信 向网点发送消息。插座可以引用对象中的任何对象 应用程序:用户界面对象,例如文本字段和按钮, 模型对象(通常是自定义类的实例),甚至 应用程序对象本身。插座是特殊实例变量 因为它们可以在Interface Builder中设置。
并且:
注意:IBOutlet是C预处理程序删除的空定义的宏 在编译时。 Interface Builder使用它来标识出口 声明,以便在连接插座时可以显示它们 视觉上。
总结:
IBOutlets可以引用几乎所有内容。它们只是一个提示 界面生成器,您可以在加载界面时设置其值 XIB。实际上,IBOutlet文本在 Interface Builder世界,从最终产品中剥离 因为除了其他目的外,它完全不起作用 帮助Interface Builder。
我会回去检查一下您连接的其他内容 作为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
}
}
使用继承,您可以将插座连接到基类并使用它 在子类中,您可以根据需要对其进行更新