Как мне получить вид в Interface Builder, чтобы загрузить пользовательский вид в другую ниб?

StackOverflow https://stackoverflow.com/questions/3944964

Вопрос

Я делаю пользовательский виджет, который я хотел бы использовать в нескольких группах. Поэтому я делаю новый 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 внутри интерфейса построителя через атрибут времени выполнения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top