Как мне получить представление в Интерфейсном Разработчике, чтобы загрузить пользовательское представление в другое перо? - PullRequest
25 голосов
/ 15 октября 2010

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

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

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

Решено - Nimrod - ПРОЧИТАЙТЕ ДЛЯ ПОЯСНЕНИЯ И КОДА

В любом случае, dood, это прекрасно.Теперь я могу создавать свои собственные классы виджетов для глупых классных вещей.Сделайте FileOwner вашего пользовательского интерфейса пером для вашего класса, и в нем просто есть обычный 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;
}

Ответы [ 2 ]

14 голосов
/ 15 октября 2010

Я чувствую вашу боль, когда дело доходит до того, что UIViewController - единственное, с чем вы можете указать загрузку пера, но я думаю, что это потому, что должен быть Владелец Файла, который является контроллером, или что-то в этом роде, хотя я не уверен, почему UIView не может быть владельцем файла.

Я думаю, вы можете поместить вещи в библиотеку под Custom Objects, но я думаю, что вы будете ограничены помещением туда UIView с классом, установленным в пользовательский подкласс UIView. Я действительно пытался расширить интерфейс разработчика, и похоже, что вы можете сделать это для OS X, но не для iPhone. Он включает в себя компиляцию кода для нового виджета в конструкторе интерфейса, чтобы сказать ему, как нарисовать виджет только внутри IB. Я думаю, что на самом деле есть шаблон OS X для этого.

Я думаю, что я, вероятно, сделал бы, чтобы создать основной вид в файле пера, который содержит все подпредставления, а затем в initWithCoder: в UIAwesomeSauce откройте файл пера, загрузите основной вид и просто поместите его в себя так что у вас есть «ненужное» представление между представлением UIAwesomeSauce и подпредставлениями (или подпредставлениями в зависимости от обстоятельств). Я не уверен, насколько это неэффективно, но при работе с некоторыми вещами это похоже на некоторые представления, такие как UIWebView похоже, у них один из этих, казалось бы, ненужных промежуточных взглядов (IIRC).

Если вы найдете лучшее решение, пожалуйста, скажите мне, потому что я тоже хотел бы знать.

EDIT

Теперь, когда я смотрю на это, я думаю, что UIView МОЖЕТ быть владельцем файла, вы просто не можете настроить его в IB. В основном вы бы назвали загрузку пера примерно так в подклассе UIView:

[связка loadNibNamed: @ "UISpecialSauce" владелец: собственные параметры: ...]

Я думаю, что если вы создаете розетки в UISpecialSauce или что-то еще, они должны быть назначены правильно из-за владельца: self.

0 голосов
/ 02 мая 2014

Theres cocoapod, который может на самом деле помочь с этим: https://github.com/mobilejazz/NibWrapper

Он обеспечивает представление оболочки, которое загружает дочернее представление из другого NIB.Вы можете указать имя этого NIB внутри компоновщика интерфейса через атрибут времени выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...