Как мне получить вид в Interface Builder, чтобы загрузить пользовательский вид в другую ниб?
-
08-10-2019 - |
Вопрос
Я делаю пользовательский виджет, который я хотел бы использовать в нескольких группах. Поэтому я делаю новый View Nib Screen3, добавьте несколько кнопок, и теперь хочу мой виджет Uiawesomesauce.
Если я просто добавлю представление, а затем измените идентичность классов, он не получает подселементы от Nib UiwesoMesauce. То же самое, если я пойду в библиотеку и переключиться на классы. Кажется, только UiviewController имеет поле для «нагрузки от Nib», что было бы красиво.
Я знаю, что я могу загрузить Uiwesomesauce Nib из кода, получить объекты верхнего уровня и поместите его вручную. Но точка IB - это так, что вам не нужно размещать вещи в коде. Даже лучше было бы, если бы я мог получить Uiawesomesauce, чтобы показать в сам список библиотеки.
Решено - по Nimrod - читайте дальше для объяснения и кода
Во всяком случае, Dood, это здорово. Я могу сделать свои собственные классы виджетов сейчас для Goofy потрясающих вещей. Сделайте файловуку своего UI NIB вашего класса, а в нем просто есть обычный UIVIEW со всеми вашими материалами. (Одиночный вид в Nib виджета не может быть самим классом, или вы получаете рекурсивный в initwithCoder.) Затем в Nib вы хотите использовать его, сделайте ванилью UIView и изменить свой класс. Вы не сможете увидеть виджет внутри этого квадрата, но сделки.
Я теперь является пустым видом, а Tmyactualself - это единственный вид, что вы сделали работу в другом Nib. Ура!
- (id)initWithCoder:(NSCoder*)coder
{
if ((self = [super initWithCoder:coder]))
{
UIView *tMyActualSelf = nil;
// Initialization code
NSArray *tNibItems = [[NSBundle mainBundle] loadNibNamed:@"UIAwesomeSauce" owner:self options:nil];
for (id object in tNibItems)
{
if ([object isKindOfClass:[UIView class]])
tMyActualSelf = (UIView *)[object retain];
}
if( tMyActualSelf )
{
tMyActualSelf.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
[self addSubview:tMyActualSelf];
}
}
return self;
}
Решение
Я чувствую твою боль, когда дело доходит до UiviewController, будучи единственным, что вы можете указать нагрузку на Nib, но я думаю, что это потому, что должен быть владелец файла, который является контроллером, или что-то в этом роде, хотя я не уверен, почему UIView не может быть владельцем файла.
Я думаю, что вы можете поставить вещи в библиотеку под пользовательскими объектами, но я думаю, что вы будете ограничены введением UIView там с классом, просто установленным на пользовательский подкласс UIView. Я на самом деле смотрел в попытку расширить интерфейс Suilder, и он выглядит так, как вы можете сделать это для OS X, но не для iPhone. Он включает в себя компиляционный код для нового виджета в Interface Builder, чтобы сказать ему, как нарисовать виджет только в пределах IB. Я думаю, что есть на самом деле шаблон OS X для этого.
Я думаю, что я бы, наверное, сделаю, это создать главный вид в файле Nib, который содержит все подсыны, затем в INITWITHCODER: в путях UiawesoMesauce открывают файл Nib, загрузите основной вид, и просто поместите его внутри себя так, чтобы вы могли иметь «ненужный» вид между видом на Uiwesomesauce и подзлыми видами (или субвезонными подварками.) Я не уверен, насколько неэффективно, но в беспорядке с некоторыми весами выглядит как некоторые виды, такие как UiWebView Один из этих, казалось бы, не существенных промежуточных взглядов (IIRC).
Если вы придумаете лучшее решение, пожалуйста, скажите мне, потому что я хотел бы знать тоже.
РЕДАКТИРОВАТЬ
Теперь, когда я смотрю на это, я думаю, что UIView может быть владельцем файла, вы просто не можете настроить его в IB. По сути, вы бы назвали нагрузку на NIB в подклассе UIVIEW:
Bundle Ladnibnamed: @ "Uipecialsauce" Владелец: Варианты самообслуживания: ...
Я думаю, что если вы создадите розетки в UiSpecialSauce или что-то еще, тогда их следует правильно назначить из-за владельца: Self.
Другие советы
Theres Cocoapod, который может на самом деле помочь с этим:https://github.com/mobilejazz/nibwrapper
Он обеспечивает вид обертки, который загружает вид ребенка с другого нибора. Вы можете указать имя этого Nib внутри интерфейса построителя через атрибут времени выполнения.