在UIViewController中使用IBDesignable和IBInspectable

时间:2015-09-30 08:26:44

标签: ios swift uiviewcontroller

我是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吗?我看到其他一些问题提到我需要使用游乐场,但我试图避免使用它,我基本上想知道是否可以查看我的整个viewcontroller?

谢谢,

2 个答案:

答案 0 :(得分:7)

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

  

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

来源:Live Rendering

答案 1 :(得分:3)

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

  1. 正如您通常所做的那样在代码中布局视图控制器
  2. 创建IBDesignable UIView子类,并将视图控制器的视图添加为子视图。
  3. 创建一个xib并将其视图设置为您在步骤2中创建的子类
  4. 要详细说明第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方法中将数据传递给视图控制器。