Пользовательский интерфейс UIView xib не отображается

#ios #objective-c #interface-builder #xib

#iOS #objective-c #конструктор интерфейса #xib

Вопрос:

У меня возникла проблема, которая, похоже, не имеет очевидного решения. Я поискал вокруг и просмотрел все распространенные ответы, которые смог найти.

Мои пользовательские представления xib не отображаются в приложении при запуске. Фон чистый, и этот файл xib имеет 5 видов изображений, как вы можете видеть ниже, для которых не установлено значение скрытый.

В классе также есть около 5 делегатов, которые я задаю от вызывающего объекта, когда делегаты были инициализированы. Вызывающий initWithDelegates: является родительским UIViewController, который отображает этот xib-файл.

CustomView.h

 @interface CustomView : UIView<SomeProtocol>

// UI Items - THESE AREN'T SHOWING UP
@property (strong, nonatomic) IBOutlet UIImageView *image1;
@property (strong, nonatomic) IBOutlet UIImageView *image2;
@property (strong, nonatomic) IBOutlet UIImageView *image3;
@property (strong, nonatomic) IBOutlet UIImageView *image4;
@property (strong, nonatomic) IBOutlet UILabel *label;

@property (strong, nonatomic) IBOutlet UIStackView *centerStackView;

- (id)initWithDelegates:(UIViewController*)delegate1 withDelegate2:(NSObject<Delegate2>*)delegate2 withDelegate3:(NSObject<Delegate3>*)delegate3 withDelegate4:(UIViewController<Delegate4>*)delegate4
    withDelegate5:(NSObject<Delegate5>*)delegate5;

@end
  

CustomView.m

 @implementation CustomView

- (void)awakeFromNib {
    [super awakeFromNib];
}

- (id)initWithDelegates:(UIViewController*)delegate1 withDelegate2:(NSObject<Delegate2>*)delegate2 withDelegate3:(NSObject<Delegate3>*)delegate3 withDelegate4:(UIViewController<Delegate4>*)delegate4
    withDelegate5:(NSObject<Delegate5>*)delegate5
{

    NSArray * arr =[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:nil options:nil];
    self = [arr firstObject];


    self.delegate1 = delegate1;
    self.delegate2 = delegate2;
    self.delegate3 = delegate3;
    self.delegate4 = delegate4;
    self.delegate5 = delegate5;

    [self setLoopImage];

    [self layoutIfNeeded];

    return self;
}
@end
  

Что еще я проверил:

  1. Я убедился, что файл xib правильно выбран в разделе «Пользовательский класс» в конструкторе интерфейса.
  2. Я прошелся по коду, чтобы убедиться в отсутствии сбоев или очевидных проблем.
  3. У xib, похоже, нет каких-либо очевидных проблем в Interface Builder, таких как значение HIDDEN.
  4. 5 просмотров изображений IBOutlet получают адрес памяти и не равны нулю.

Любая помощь приветствуется!

Обновить:

Я полагаю, что это как-то связано с размещением элементов во вложенном UIView. В построителе интерфейса порядок таков: UIViewController -> UIView -> nibs

Похоже, что не существует способа зарегистрировать nibs из родительского UIViewController, который есть в таких классах, как UITableView.

Я также пытался:

  1. Настройка цвета фона в xib, чтобы убедиться, что он отображается. Это не так. Однако, если я установлю красный цвет фона в родительском окне, куда я добавил представление в Interface Builder, оно станет красным. (См. рисунок 1), а мой файл xib показан на рисунке 2
  2. Перезапустил initWithFrame, чтобы убедиться, что он вызывается. Он вызывается.
  3. Думая, что представление может быть создано дважды, один с помощью автозапуска, а другой с помощью моего пользовательского метода инициализации, я попытался сделать так, чтобы (id)initWithDelegates метод не инициализировался или зарегистрировать перо на случай, если это дублирует объект. Я сделал это, удалив 1) return self , 2) строки, которые регистрируют кончик, и 3) заставив прототип метода возвращать void, т.е. (void)initWithDelegates — Это тоже не сработало.
  4. Я попробовал эти строки в initWithDelegates : [self addSubview: self.image1];
    [self bringSubviewToFront: self.image1];
    [self.menuImage setHidden:image1];
    безуспешно.

Рисунок 1: (фактический результат)
Актуально

Рисунок 2 (ожидаемый.. на красном фоне)
Ожидается

Комментарии:

1. можете ли вы поделиться своим кодом, в котором вы вызываете это в родительском viewcontroller? Зарегистрирован ли пользовательский view xib в parentVC (возможно, в методе viewDidLoad)?

2. Пользовательский xib-файл не зарегистрирован в родительском.. хотя ни то, ни другое не является моим расширением UITableView xib, и это работает.. Я попробую это сегодня вечером, и если это не сработает, я поделюсь кодом настройки в родительском файле. Спасибо.

3. Родительским является UIViewController, а у UIViewController нет способа зарегистрировать перо, которое я могу найти… Например, этот метод является частью UITableView, но не UIViewController: [self registerNib:[UINib nibWithNibName:@пакет «CustomView»: nil] forCellReuseIdentifier:@»ReuseId123″];

4. Кроме того, у CustomView есть родительский UIView в родительском UIViewController. IBOutlet из CustomView пропускает родительский файл и подключается к UIViewController

5. интересно, следует ли установить для владельца значение self вместо nil. Вы пробовали установить для него значение self в строке loadNibNamed …. ?

Ответ №1:

Проверьте свое автоматическое описание в вашем пользовательском XIB. Из-за этого что-то в содержимом не отображается. Например: только центрировать по вертикали и центрировать по горизонтали. Попробуйте выполнить другое ограничение автозапуска в вашем представлении в пользовательском классе.

Ответ №2:

Я думаю, что что-то не так с макетом вашего CustomView внутри parentView. Не могли бы вы, пожалуйста:

  • Проверьте фрейм CustomView при добавлении его в parentView.

  • Проверьте ограничения, у которых есть CustomView внутри parentView. Если у вас их нет — добавьте его, ограничения помогут iOS склеить макет вашего пользовательского представления. Более подробную информацию об этом вы можете найти здесь, программно создавая ограничения

  • А также вы можете попробовать использовать «Иерархию представлений отладки» в Xcode, чтобы проверить, что происходит на вашем экране, там вы можете найти свой CustomView в иерархии представлений, и вы увидите, что не так.

Ответ №3:

элементы не могут быть вложены в структуру.

Вместо:

UIViewController -> UIView -> nibs..

Это должно быть:

UIViewController -> Просмотр контейнера -> UIView с остриями.