代码之家  ›  专栏  ›  技术社区  ›  Bruno Bieri

如何使用ibu DESIGNABLE可视化故事板中可重用的xib?

  •  1
  • Bruno Bieri  · 技术社区  · 6 年前

    我想使用Xcode9.2中的ibu可设计常量,在故事板中可视化XIB,目标是iOSSDK11.2。

    根据 this article prepareForInterfaceBuilder 方法由接口生成器调用,以允许您执行只能对接口生成器执行的操作。

    基于此 article 我想在我的故事板中形象化XIB。当我使用 UIView

    • 首先将自定义类 XibView
    • nibName 属性到 MainViewController

    我得到以下构建时错误:

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

    这就是 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 回复  |  直到 6 年前
        1
  •  1
  •   rob mayoff    6 年前

    以下是我认为有缺陷的方法:

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

    笔尖加载程序无法设置 self.contentView 因为你没有通过 self 作为 owner 论据 loadNibNamed:options: . 请尝试以下操作:

        [[NSBundle mainBundle] loadNibNamed:_nibName owner:self options:nil];
    
        2
  •  0
  •   Bruno Bieri    6 年前

    在…的帮助下 @E.Coms this article 我知道问题出在哪里了。在这里,您可以找到以下步骤,以便为其他人提供答案

    如何使用Objective-C可设计的IB\ U在序列图像板中可视化可重用的XIB?

    1. 创建Xib-c头文件和类文件( XibViewHolder )
    2. 创建Xib文件( MyView.xib )
    3. 将Xib的“文件所有者”类设置为 XibViewHolder公司
    4. 在任何视图控制器的情节提要上添加 UIView
    5. 把它调好 UIView视图 XibViewHolder公司
    6. 把它调好 UIView视图 的接口生成器属性名为Nib Name,它是在Xib holder类中定义的,用于指定要加载的Xib的名称,例如: MyView .

    这就是 XibViewHolder.h

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

    这就是 XibViewHolder.m

    #import "XibViewHolder.h"
    
    @implementation XibViewHolder
    
    - (void)awakeFromNib
    {
        [super awakeFromNib];
        [self xibSetup];
    }
    
    - (void)prepareForInterfaceBuilder
    {
        [super prepareForInterfaceBuilder];
        [self xibSetup];
        [self.contentView prepareForInterfaceBuilder];
    }
    
    - (void)xibSetup
    {
        if (_nibName == nil) { return; }
        UIView* loadedNibView = [self loadViewFromNib];
        loadedNibView.frame = self.bounds;
        loadedNibView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
        [self addSubview:loadedNibView];
        self.contentView = loadedNibView;
    }
    
    - (UIView*)loadViewFromNib
    {
        NSBundle* bundle = [NSBundle bundleForClass:[self class]];
        UINib* nib = [UINib nibWithNibName:_nibName bundle:bundle];
        return [nib instantiateWithOwner:self options:nil].firstObject;
    }
    
    @end