如何指定嵌套的自定义视图类?

时间:2015-03-15 20:55:19

标签: ios xcode swift storyboard nested-class

可用 嵌套类SuperView和NestedView。

class SuperView : UIImageView {

    class NestedView : UIImageView {
        var text : String = "Nested View"
    }

    var text : String = "Super View"
    var nested : NestedView?

}

我想在故事板场景的检查器中为UIImageView设置名为“Custom Class Name”的属性,以赋值“NestedView”。但是Interface Builder找不到“NestedView”类。

enter image description here

3 个答案:

答案 0 :(得分:14)

目前,我认为Interface Builder只识别Objective-C类的名称。您仍然可以使Interface Builder找到带有@objc关键字的嵌套类:

class SuperView: UIView {
  @objc(SVNestedView) class NestedView: UIImageView {
  }
}

然后,在Interface Builder中,指定该视图是SVNestedView类。由于Objective-C没有命名空间,你仍然需要为每个嵌套类选择唯一的名称,但至少Swift方面是正确的命名空间。

答案 1 :(得分:0)

在Swift中,内部类的实例独立于外部类的任何实例。就好像Swift中的所有内部类都是使用Java的静态声明的。

我不认为这种类设计符合您的要求。您需要做的是,您需要在视图之外创建一个新的,并创建某种组合。这肯定会为你效劳。

以下是对您的代码的一些修改:

class SuperView : UIImageView {
    var text : String = "Super View"
    var nested : NestedView = NestedView()
}

class NestedView : UIImageView {
    var text : String = "Nested View"
}

答案 2 :(得分:0)

到目前为止,我认为无法在类似SuperView.NestedView的情节提要中指定内部类。因此,我从内部类扩展了一个类,然后在类似SuperView_NestedView的情节提要中指定了它。这个对我有用。

final class SuperView_NestedView: SuperView.NestedView {} // Specifies this class in the storyboard 
class SuperView : UIImageView {

    class NestedView : UIImageView {
        var text : String = "Nested View"
    }

    var text : String = "Super View"
    var nested : NestedView?

}

由于SuperView.NestedView是从SuperView_NestedView扩展而来的,因此从ViewController可以将此视图称为SuperView.NestedView

class TheViewController: UIViewController {
    @IBOutlet var nestedView: SuperView.NestedView!