使用IBDesignable和IBInspectable来配合UIViewController

16

我是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()
}

我的问题是如何在IBDesignable和IBInspectable中使用界面构建器?我需要添加.xib文件吗?我看到其他一些问题提到我需要使用playground,但我尽量避免使用它,我实际上想知道是否可以查看整个视图控制器。

谢谢。

2个回答

8
您不能将IBDesignable与不继承自UIView或NSView的其他类一起使用。请查看苹果关于IBDesignable的指南:
当您创建一个继承自UIView类或NSView类的自定义视图时,可以在类声明之前添加@IBDesignable属性来启用实时交互式自定义视图设计,您可以使用两个不同的属性@IBDesignable和@IBInspectable。
来源:Live Rendering

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;
}

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


如果您将一个UIView添加到UIViewController中,那么您将失去ViewController的生命周期,例如viewWill和DidAppear。 这不是有些过度了吗? - OhadM

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