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

19

可用的嵌套类包括SuperView和NestedView。

class SuperView : UIImageView {

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

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

}

我想在Storyboard场景的检查器中,将UIImageView的"Custom Class Name"属性设置为"NestedView"。但是,Interface Builder找不到"NestedView"类。

enter image description here


2
基于嵌套类型在其他地方的工作方式,我的期望是你可以将类分配给SuperView.NestedView,但接口构建器不允许这样做。我认为这将是一个很好的功能,用于命名小型、专用的子视图空间。 - Anthony Mattox
3个回答

17

我认为目前 Interface Builder 只认识 Objective-C 类的名称。但如果在嵌套类上使用 @objc 关键字,仍可以让 Interface Builder 找到它:

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

然后,在 Interface Builder 中,指定该视图的类为 SVNestedView。由于 Objective-C 没有命名空间,因此仍然需要为每个嵌套类选择唯一的名称,但至少 Swift 部分已经正确命名空间化了。


谢谢,这非常方便! - Rudolf Adamkovič
4
在Xcode 8.1中,似乎无法与Swift 3一起使用。在Interface Builder中仍然看不到SVNestedView - oleynikd
不幸的是,Xcode似乎不支持显示嵌套类的连接IBOutlets - ThomasW

0
在Swift中,内部类的实例与外部类的任何实例都是独立的。就好像所有Swift中的内部类都是使用Java的static声明的一样。
我认为这种类设计不适合您的要求。您需要做的是,在视图之外创建一个新类,并创建某种组合。这肯定会对您有所帮助。
以下是对您代码的一些修改:
class SuperView : UIImageView {
    var text : String = "Super View"
    var nested : NestedView = NestedView()
}

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

0

我认为目前无法在Storyboard中指定内部类,例如SuperView.NestedView。因此,我创建了一个继承自内部类的类,然后在Storyboard中将其指定为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!


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