Как визуализировать повторно используемые xibs в раскадровках, используя IB_DESIGNABLE? - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу визуализировать XIB в раскадровке, используя константу IB_DESIGNABLE в Xcode 9.2 с Objective C для iOS SDK 11.2.

Согласно этой статье от Apple theprepareForInterfaceBuilder метод вызывается Интерфейсным Разработчиком, чтобы позволить вам делать то, что должно быть сделано только для Интерфейсного Разработчика.

Когда Интерфейсный Разработчик создает экземпляр класса с атрибутом IB_DESIGNABLE, он вызывает этот метод, чтобы позволитьПолученный объект знает, что он был создан во время разработки.Вы можете реализовать этот метод в своих проектируемых классах и использовать его для настройки их внешнего вида во время разработки.

Основываясь на этой статье Я хочу визуализировать XIB в своей раскадровке.Когда я использую элемент UIView в ViewController и устанавливаю

  • сначала пользовательский класс равен 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.

Что я делаю неправильно, что я получаю эту ошибку вместо визуализированного XIB в представлении, которое я использую в главном.storyboard?

Это 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 голосов
/ 01 октября 2018

С помощью @E.Coms и по-прежнему на основе этой статьи Я понял, в чем проблема.Чтобы доставить ответ, который будет использоваться для других, здесь вы можете найти шаги

Как визуализировать повторно используемые xibs в раскадровках, используя IB_DESIGNABLE с Objective-C?

  1. Создайте заголовок объекта-c держателя Xib и файл класса (XibViewHolder)
  2. Создайте файл Xib (MyView.xib)
  3. Установите для класса «Владелец файла» Xib значение XibViewHolder
  4. На вашей раскадровке на любом контроллере представления добавьте UIView
  5. Установите класс UIView на XibViewHolder class
  6. Установите интерфейс UIViewСвойство Builder с именем Nib Name, определенное в классе держателя Xib, для имени 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
0 голосов
/ 27 сентября 2018

Вот метод, который, я думаю, содержит ошибку:

- (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];
...