将 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
Swift 无法从 @IBDesignable 类设置视图的高度