Я создал аналогичные конструкции, за исключением того, что я не использую результат в IB, а создаю экземпляр с использованием кода.Я опишу, как это работает, и в конце я дам вам подсказку, как это можно использовать для достижения ваших целей.
Я начинаю с пустого файла XIB, в который добавляю один пользовательскийпосмотреть на верхнем уровне.Я настраиваю это пользовательское представление, чтобы быть моим классом.Ниже в иерархии представлений я создаю и настраиваю подпредставления по мере необходимости.
Я создаю все IBOutlets в своем классе пользовательского представления и подключаю их там.В этом упражнении я полностью игнорирую «владельца файла».
Теперь, когда мне нужно создать представление (обычно в контроллере как часть цикла while / for, чтобы создать столько их, сколько необходимо), яиспользуйте функциональность NSBundle следующим образом:
- (void)viewDidLoad
{
CGRect fooBarViewFrame = CGRectMake(0, 0, self.view.bounds.size.width, FOOBARVIEW_HEIGHT);
for (MBSomeData *data in self.dataArray) {
FooBarView *fooBarView = [self loadFooBarViewForData:data];
fooBarView.frame = fooBarViewFrame;
[self.view addSubview:fooBarView];
fooBarViewFrame = CGRectOffset(fooBarViewFrame, 0, FOOBARVIEW_HEIGHT);
}
}
- (FooBarView*)loadFooBarViewForData:(MBSomeData*)data
{
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"FooBarView" owner:self options:nil];
FooBarView *fooBarView = [topLevelObjects objectAtIndex:0];
fooBarView.barView.amountInEuro = data.amountInEuro;
fooBarView.barView.gradientStartColor = data.color1;
fooBarView.barView.gradientMidColor = data.color2;
fooBarView.titleLabel.text = data.name;
fooBarView.titleLabel.textColor = data.nameColor;
return fooBarView;
}
Обратите внимание, как я установил для владельца nib self
- нет никакого вреда, поскольку я ни к чему не подключил «Владельца файла».Единственный ценный результат загрузки этого пера - это его первый элемент - мой взгляд.
Если вы хотите адаптировать этот подход для создания представлений в IB, это довольно просто.Реализуйте загрузку подпредставления в основном пользовательском представлении.Установите рамку подпредставления для границ основного вида, чтобы они были одинакового размера.Основное представление станет контейнером для вашего реального пользовательского представления, а также интерфейсом для внешнего кода - вы открываете только необходимые свойства его подпредставлений, остальное инкапсулируется.Затем вы просто отбрасываете пользовательское представление в IB, настраиваете его как свой класс и используете как обычно.