在UIViewController中使用IBDesignable和IBInspectable

Gug*_*ugi 14 uiviewcontroller ios swift

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

现在我有一个视图控制器,上面有各种按钮和标签.这是我的代码片段:

@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()
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

小智 7

您不能将IBDesignable与另一个不从UIView或NSView继承的类一起使用.查看Apple关于IBDesignable的指南:

您可以使用两个不同的属性 - @ IBDesignable和@ IBInspectable - 在Interface Builder中启用实时交互式自定义视图设计.创建从UIView类或NSView类继承的自定义视图时,可以在类声明之前添加@IBDesignable属性

来源:实时渲染

一个


Jef*_*mes 4

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

  1. 像平常一样在代码中布局视图控制器
  2. 创建一个 IBDesignable UIView 子类并将视图控制器的视图添加为子视图。
  3. 创建一个 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;
}
Run Code Online (Sandbox Code Playgroud)

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