从超类覆盖IBOutlet属性?

12

我希望在一个框架中创建一个超类,该类可以修改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?

}

我收到的错误是:无法使用存储属性“titleLabel”、“dateLabel”和“contentWebView”进行覆盖

我应该如何解决这个问题或采取更好的方法?

2个回答

15

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

  1. Utilites(右面板)-> Connection Inspector - 从IBOutlets列表中拖动。
  2. 文档大纲(左面板)- 从MyDetailViewController中拖动
  3. 当您在Interface Builder中选择UIViewController时,从黄色圆圈中拖动

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


0

所有的子类都可以直接访问超类中的outlets,因此您可以直接在相应的子类中更改outlets属性。就像这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接