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

How to specify nested custom view class?

可用 嵌套 classes SuperView 和 NestedView。

class SuperView : UIImageView {

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

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

}

我想在故事板场景的检查器中为一个名为 "Custom Class Name" 的 属性 的 UIImageView 设置值 "NestedView"。但是 Interface Builder 找不到 "NestedView" class.

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

我认为这个 class 设计不符合您的要求。你需要做的是,你需要创建一个新的 class outside 你的视图,并创建某种组合。这一定对你有用。

这里是对您的代码的一些修改:

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

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

此时,我认为 Interface Builder 只能识别 Objective-C classes 的名称。您仍然可以使用 @objc 关键字让 Interface Builder 找到嵌套的 class:

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

然后,在 Interface Builder 中,指定视图属于 class SVNestedView。由于 Objective-C 未命名空间,您仍然需要为每个嵌套的 class 选择唯一的名称,但至少 Swift 端已正确命名空间。

我认为到目前为止不可能在像 SuperView.NestedView 这样的故事板中指定一个内部 class。所以我从内部 class 扩展了一个 class,然后在像 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?

}

此视图可以从 ViewController 引用为 SuperView.NestedView,因为 SuperView_NestedView 是从 SuperView.NestedView 扩展而来的。

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