从超类覆盖IBOutlet属性?

时间:2016-04-03 22:36:12

标签: ios swift iboutlet

我想在修改IBOutlet属性的框架中创建一个超类。但是,我想将一个子类连接到storyboard,因为我不想将控件连接到框架中的类。

例如,我的框架中的超类看起来像这样:

public class MySuperDetailViewController: UIViewController {

    @IBOutlet public weak var titleLabel: UILabel?
    @IBOutlet public weak var dateLabel: UILabel?
    @IBOutlet public weak var contentWebView: UIWebView?

    ...
}

然后在子类中,我想控制 - 将控件拖到子类上。所以我必须通过覆盖来公开这些属性。我试图这样做,但它不允许我:

class MyDetailViewController: MySuperDetailViewController {

    @IBOutlet weak var titleLabel: UILabel?
    @IBOutlet weak var dateLabel: UILabel?
    @IBOutlet weak var contentWebView: UIWebView?

}

我得到的错误是:Cannot override with a stored property 'titleLabel', 'dateLabel', and 'contentWebView'

我该如何做到这一点或更好地解决这个问题?

2 个答案:

答案 0 :(得分:14)

不要尝试在子类中重新创建变量; IBOutlet变量仍然存在。您仍然可以通过多种方式在Interface Builder内部连接它们。

  1. Utilites(右图) - >连接检查器 - 从IBOutlets列表中拖动。
  2. 文档大纲(左侧面板) - 从MyDetailViewController
  3. 拖动
  4. 在Interface Builder
  5. 中选择了UIViewController时,从黄色圆圈拖动

    注意:所有UIViewController子类都继承了名为view的IBOutlet;即使您无法单击+拖动以连接它,此属性也已存在于Interface Builder中。

答案 1 :(得分:0)

所有sub-classes都可以直接访问outlets中的super-class。因此,您可以直接在相应的properties中更改outlets中的sub-class。像这样:

class MySubClass: MySuperClass {
    override func viewDidLoad() {
        super.viewDidLoad()
        mySuperClassOutlet.text = "This overrides superclass text"
    }
}