#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
Что еще я проверил:
- Я убедился, что файл xib правильно выбран в разделе «Пользовательский класс» в конструкторе интерфейса.
- Я прошелся по коду, чтобы убедиться в отсутствии сбоев или очевидных проблем.
- У xib, похоже, нет каких-либо очевидных проблем в Interface Builder, таких как значение HIDDEN.
- 5 просмотров изображений IBOutlet получают адрес памяти и не равны нулю.
Любая помощь приветствуется!
Обновить:
Я полагаю, что это как-то связано с размещением элементов во вложенном UIView. В построителе интерфейса порядок таков: UIViewController -> UIView -> nibs
Похоже, что не существует способа зарегистрировать nibs из родительского UIViewController, который есть в таких классах, как UITableView.
Я также пытался:
- Настройка цвета фона в xib, чтобы убедиться, что он отображается. Это не так. Однако, если я установлю красный цвет фона в родительском окне, куда я добавил представление в Interface Builder, оно станет красным. (См. рисунок 1), а мой файл xib показан на рисунке 2
- Перезапустил initWithFrame, чтобы убедиться, что он вызывается. Он вызывается.
- Думая, что представление может быть создано дважды, один с помощью автозапуска, а другой с помощью моего пользовательского метода инициализации, я попытался сделать так, чтобы
(id)initWithDelegates
метод не инициализировался или зарегистрировать перо на случай, если это дублирует объект. Я сделал это, удалив 1)return self
, 2) строки, которые регистрируют кончик, и 3) заставив прототип метода возвращать void, т.е.(void)initWithDelegates
— Это тоже не сработало. - Я попробовал эти строки в initWithDelegates :
[self addSubview: self.image1];
— безуспешно.
[self bringSubviewToFront: self.image1];
[self.menuImage setHidden:image1];
Комментарии:
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 с остриями.