将 IBDesignable 和 IBInspectable 与 UIViewController 一起使用

Posted

技术标签:

【中文标题】将 IBDesignable 和 IBInspectable 与 UIViewController 一起使用【英文标题】:Using IBDesignable and IBInspectable with UIViewController 【发布时间】:2015-09-30 08:26:43 【问题描述】:

我是 ios 开发新手。我正在使用 swift,我想以编程方式设计我的视图,但我想使用 IBDesigner 和 IBInspectable 来加快我的设计过程。

现在我有一个视图控制器,上面有各种按钮和标签。这是我的代码的 sn-p:

@IBDesignable class LandingView: UIViewController, LandingViewProtocol 

    @IBInspectable lazy var backButton: UIButton = 
        var button = UIButton()
        button.backgroundColor = Styles.BUTTON_COLOR
        return button
    ()
    @IBInspectable lazy var caption: UILabel = UILabel()

我现在的问题是如何将界面构建器与 IBDesignable 和 IBInspectable 一起使用?我需要添加 .xib 吗?我看到其他一些问题提到我需要使用游乐场,但我试图避免使用它,我基本上想知道是否可以查看我的整个视图控制器?

谢谢,

【问题讨论】:

【参考方案1】:

您不能将 IBDesignable 与不继承自 UIView 或 NSView 的其他类一起使用。查看 Apple 关于 IBDesignable 的指南:

您可以使用两种不同的属性——@IBDesignable 和 @IBInspectable——启用实时、交互式的自定义视图设计 界面生成器。当您创建继承自的自定义视图时 UIView 类或 NSView 类,您可以添加 @IBDesignable 类声明之前的属性

来源:Live Rendering

一个

【讨论】:

【参考方案2】:

有一种解决方法可以使用 IBDesignable 测试您的视图控制器布局。

    像往常一样在代码中布局视图控制器 创建一个 IBDesignable UIView 子类,并将视图控制器的视图添加为子视图。 创建一个 xib 并将其视图设置为您在步骤 2 中创建的子类

详细说明第 2 步,您的 IBDesignable 的 initWithFrame: 方法可能如下所示

- (instancetype)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    MyViewController *viewController = [MyViewController alloc] init];
    viewController.view.frame = self.bounds;
    [self addSubview:viewController.view];
    return self;

因此,除了这个 initWithFrame 方法之外,您的所有布局代码都可以由您的视图控制器处理。您可能希望在子视图的 prepareForInterfaceBuilder 方法中将数据传递给视图控制器。

【讨论】:

如果您添加 UIViewController 的 UIView,您将失去 ViewController 的生命周期,例如 viewWill 和 DidAppear。这不是矫枉过正吗?

以上是关于将 IBDesignable 和 IBInspectable 与 UIViewController 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

IBDesignable UIButton 子类

无法将自定义 IBDesignable 类链接到情节提要上的 UIButton

IBOutlet 在 IBDesignable 类中为零

Swift 无法从 @IBDesignable 类设置视图的高度

将故事板指南标题设置为 @IBInspectable 值,以便快速自定义 @IBDesignable 视图?

如何在 IBDesignable 文件中设置高度约束?