【问题标题】:Using IBDesignable and IBInspectable with UIViewController将 IBDesignable 和 IBInspectable 与 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 吗?我看到其他一些问题提到我需要使用游乐场,但我试图避免使用它,我基本上想知道是否可以查看我的整个视图控制器?

谢谢,

【问题讨论】:

    标签: ios swift uiviewcontroller


    【解决方案1】:

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

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

    来源:Live Rendering

    一个

    【讨论】:

      【解决方案2】:

      有一种解决方法可以使用 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 方法中将数据传递给视图控制器。

      【讨论】:

      • 如果您添加 UIViewController 的 UIView,您将失去 ViewController 的生命周期,例如 viewWill 和 DidAppear。这不是矫枉过正吗?
      猜你喜欢
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2020-03-12
      相关资源
      最近更新 更多