【问题标题】:Why does Interface Builder not show a view controller subclass in the identity inspector?为什么 Interface Builder 不在身份检查器中显示视图控制器子类?
【发布时间】:2017-06-26 19:31:59
【问题描述】:

我有一个BaseViewController,我想在子类中继承它。当我这样做时,子类“TestViewController”不会出现在 Xcode 界面构建器的类下拉列表中(见下图)。这不可能吗?

class BaseViewController<T: AnyObject> : UIViewController{

    var  test: T?

    override func viewDidLoad() { }

}

class TestViewController : BaseViewController<UIView>{ }

如果我只输入类名,则会收到运行时错误消息:

Interface Builder 文件中的未知类 TestViewController

试过

  • 删除对文件的引用并重新添加它们
  • 使用文本编辑器编辑情节提要并向属性“customClass”添加名称

【问题讨论】:

    标签: ios swift xcode


    【解决方案1】:

    很简单:你不能在这里使用泛型类型。原因是 UIKit 是用 ObjC 编写的,泛型类型对 ObjC 并不完全可见。 This answer 详细介绍。

    【讨论】:

    • 请注意,尽管视图控制器本身不能是泛型的,但它可以扩展一个泛型类型和typealias 将类型扩展到它需要的任何类型。
    • @NRitH 这不是我的理解,但我会尝试验证。
    • 几周前我不得不自己做这个,所以我很确定它可以工作。 :)
    • 好吧,让我们弄清楚我们在说什么。当然,您可以创建一个通用的UIViewController 子类,然后创建typealias 该子类,例如typealias FooViewController = GenericViewController&lt;Foo&gt;。那没问题。但是你能在 Interface Builder 中使用 typealias 吗?我对后者持怀疑态度。事实上,如果你是对的,我认为我的答案是不正确的。
    • 我说的是class FooViewController: UIViewController, SomeProtocolThatHasAnAssociatedType { typealias SomeAssociatedType = Foo }。现在FooViewController 出现在 IB 身份检查器中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多