子类中的UIView作为@IBOutlet,而超类中的UIView是实例属性,而不是插座

时间:2018-08-20 13:09:22

标签: ios swift xcode9 iboutlet

我有一个超类,其中我将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 {}
    }

}

有什么建议吗?

1 个答案:

答案 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
        }
    }
  

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