【问题标题】:Can we use a nested class for IBDesignable?我们可以为 IBDesignable 使用嵌套类吗?
【发布时间】:2021-12-06 10:33:58
【问题描述】:

我正在用 Swift 开发一个图形库。代码无法共享,但我做了一个示例here(参见按钮示例,单选按钮专用于另一个问题)。

我想为我的组件创建一个命名空间 MyGraphicLibraryMyGraphicLibrary.Button 而不是 MyGraphicLibraryButton

示例 pod 有两个类:

// Independent class
@IBDesignable public class CustomButton: UIButton {
    ...
}

// Namespace for my components
public class MyGraphicLibrary: NSObject {

}

// Namespaced button
public extension MyGraphicLibrary {
    @objc(MyGraphicLibraryButton) @IBDesignable class Button: UIButton {
        ...
    }
}

CustomButton 类在界面构建器中的行为符合预期:我可以轻松地将自定义类添加到按钮(请参阅Main.storyboard)。

对于嵌套类,无法使用其正常名称(ButtonMyGraphicLibrary.Button)进行设置。

唯一的办法就是设置类@objc名称MyGraphicLibraryButton;没有自动补全,模块必须设置为none(看起来很废话,该类属于GraphicLibrary模块)。删除 @objc 名称没有区别。

有没有办法让Interface Builder正确处理嵌套类?

【问题讨论】:

    标签: ios swift inner-classes ibdesignable


    【解决方案1】:

    我认为,总的来说,您的问题的答案是“不”,您不能以您尝试的方式使用 Objective-C 类。

    Interface Builder 正在其界面中寻找一个 Objective-C 类名称。 Objective-C 为类名提供了一个平坦的空间。没有嵌套命名空间的概念(这就是为什么你最终会使用像“NS”这样的名称前缀)

    您正试图使用​​ Swift 的特性强加一个命名空间结构,但该结构对 Objective-C 没有意义。即使你在嵌套的 Swift 上下文中声明了一个 Objective-C 类,它仍然会存在于 Objective-C 类的平面空间中。

    Interface Builder 将从该平面空间中提取名称。

    【讨论】:

    • 我明白了,这正是前缀 objc 名称的目标。但是为什么我不能在下拉列表中有这个类呢?为什么我只能添加“模块”设置为“无”的类?
    • 主要是因为您所做的事情不寻常,而且它似乎让 Interface Builder 感到困惑。如果您希望支持该行为,那么我会通过他们的反馈机制联系 Apple,并描述您希望这种行为的方式。
    猜你喜欢
    • 2019-01-13
    • 2011-01-05
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多