如何使用IB_DESIGNABLE可视化情节提要中的可重用xib?

时间:2018-09-27 19:40:58

标签: ios xcode interface-builder xcode9.2

我想使用Xcode 9.2中的IB_DESIGNABLE常量以及针对iOS SDK 11.2的Objective C来可视化故事板中的XIB。

根据Apple的this article,Interface Builder调用了prepareForInterfaceBuilder方法,以使您可以执行仅应针对Interface Builder进行的操作。

  

当Interface Builder实例化具有IB_DESIGNABLE属性的类时,它将调用此方法以使生成的对象知道它是在设计时创建的。您可以在可设计的类中实现此方法,并使用它来配置其设计时外观。

基于此article,我想在情节提要中可视化XIB。当我在ViewController上使用UIView元素并设置

  • 首先将自定义类添加到XibView
  • nibName属性MainViewController设置为XIB文件的名称

我收到以下构建时错误:

Main.storyboard:
error: IB Designables: 
Failed to render and update auto layout status for MainViewController (8zi-kg-fjR):
The agent threw an exception.

我做错了什么,我得到了这个错误,而不是在Main.storyboard中使用的视图中的可视化XIB?

这是XibView.h

IB_DESIGNABLE
@interface XibView : UIView
@property (nonatomic, strong) IBOutlet UIView* contentView;
@property (nonatomic) IBInspectable NSString* nibName;
@end

这是XibView.m

#import "XibView.h"

@implementation XibView

- (id)initWithCoder:(NSCoder *) coder
{
    self = [super initWithCoder: coder];
    if (self)
    {
        [self xibSetup];
    }
    return self;
}

//---------------------------------------------------------------------

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self xibSetup];
    }
    return self;
}

//---------------------------------------------------------------------

- (void)prepareForInterfaceBuilder
{
    [super prepareForInterfaceBuilder];
    [self xibSetup];
}

//---------------------------------------------------------------------

- (void)xibSetup
{
    [[NSBundle mainBundle] loadNibNamed:_nibName owner:nil options:nil];
    [self addSubview:self.contentView];
    self.contentView.frame = self.bounds;
}

@end

2 个答案:

答案 0 :(得分:1)

这是我认为存在错误的方法:

- (void)xibSetup
{
    [[NSBundle mainBundle] loadNibNamed:_nibName owner:nil options:nil];
    [self addSubview:self.contentView];
    self.contentView.frame = self.bounds;
}

笔尖加载器无法设置self.contentView,因为您没有将self作为owner的{​​{1}}参数传递。尝试以下方法:

loadNibNamed:options:

答案 1 :(得分:0)

借助@E.Coms并仍然基于this article,我弄清了问题所在。要在此处提供供他人使用的答案,您可以找到步骤

如何使用带有Objective-C的IB_DESIGNABLE可视化情节提要中的可重用xib?

  1. 创建Xib持有者Objective-c标头和类文件(<meta\s+property=\"og:updated_time\"\s+content=\"([^"]+)\"
  2. 创建Xib文件(XibViewHolder
  3. 将Xib的“文件所有者”类设置为MyView.xib
  4. 在任何视图控制器上的情节提要上添加一个XibViewHolder
  5. UIView的班级设置为UIView的班级
  6. XibViewHolder的名为Nib Name的Interface Builder属性(在Xib持有人类中定义)设置为要加载的Xib的名称,例如:UIView

这是MyView

XibViewHolder.h

这是IB_DESIGNABLE @interface XibViewHolder : UIView @property (nonatomic, strong) UIView* contentView; @property (nonatomic, strong) IBInspectable NSString* nibName; @end

XibViewHolder.m