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

Я создам собственный виджет, который хотел бы использовать в нескольких перьях. Итак, я создаю новое перо вида Screen3, добавляю несколько кнопок и теперь хочу свой виджет UIAwesomeSauce.

Если я просто добавлю представление, а затем изменю идентификатор класса, он не t получить подэлементы из пера UIAwesomeSauce. То же самое, если я перейду в библиотеку и переключусь на классы. Кажется, только UIViewController имеет поле для «Загрузить из пера», что было бы прекрасно.

Я знаю, что могу загрузить перо UIAwesomeSauce из кода, получить объекты верхнего уровня и разместить его вручную. Но суть IB в том, что вам не нужно помещать что-то в код. Еще лучше было бы, если бы я мог заставить UIAwesomeSauce отображаться в самом списке библиотек.

РЕШЕНО - Nimrod - ПРОЧИТАЙТЕ ПОЯСНЕНИЯ И КОД

В любом случае, черт, это здорово. Теперь я могу создавать свои собственные классы виджетов для глупых крутых вещей. Сделайте FileOwner своего UI-пера своим классом, и в нем просто используйте обычный UIView со всеми вашими вещами. (Единственное представление в пике виджета не может быть самим классом, иначе вы получите рекурсию в initWithCoder. Затем в пере, которое вы хотите использовать, создайте ванильный UIView и измените его класс. Вы не сможете на самом деле увидеть виджет внутри этого квадрата, но сделайте это.

Self теперь является пустым представлением, а tMyActualSelf - единственным представлением, с которым вы работали в другом кончике. Ура!

- (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;
}
25
задан yeoman 8 January 2017 в 18:21
поделиться