Как использовать универсальный (NSObject) контроллер с подвидами UIViewController?

У меня есть UIViewController, который загружает несколько подпредставлений в разное время в зависимости от взаимодействия с пользователем. Первоначально я создал все эти подпредставления в коде без файлов пера. Теперь я перехожу к файлам пера с пользовательскими подклассами UIView.

Некоторые из этих подпредставлений отображают статические данные, и я использую loadNibNamed:owner:options: для их загрузки в контроллер представления. Другие содержат элементы управления, к которым мне нужно получить доступ.

Я (вроде как) понимаю причины, по которым Apple говорит использовать один контроллер представления для каждого экрана контента, используя общие объекты контроллера (NSObjects) для управления подразделами экрана.

Поэтому мне нужен контроллер представления, универсальный контроллер, класс представления и перо. Как мне собрать все это вместе?

Мои рабочие предположения и последующие вопросы:

  • Я свяжу класс представления с наконечником в раскрывающемся списке «идентификация класса» в IB.
  • Контроллер представления будет координировать общие взаимодействия с экраном. При необходимости он создаст экземпляр универсального контроллера.
  • Загружает ли универсальный контроллер перо? Как?
  • Определять ли выходы и действия в этом классе представления, или они должны быть в универсальном контроллере?
  • Как передавать сообщения между контроллером представления и универсальным контроллером?

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


person wanderlust    schedule 08.03.2010    source источник
comment
Вот документация Apple: Примечание. Если вы хотите разделить один экран на несколько областей и управлять каждой из них отдельно, используйте общие объекты контроллера (пользовательские объекты, происходящие от NSObject) вместо объектов контроллера представления для управления каждым подразделом экрана. Затем используйте один объект контроллера представления для управления универсальными объектами контроллера. Контроллер представления координирует общие взаимодействия с экраном, но по мере необходимости пересылает сообщения на общие объекты контроллера, которыми он управляет.   -  person wanderlust    schedule 08.03.2010


Ответы (2)


Ладно, кажется, я понял:

  1. Расширьте NSObject, чтобы сделать свой CustomController
  2. Определите свои выходы и действия в CustomController.h, включая ссылку на UIView в вашем наконечнике.
  3. Установите владельца файла вашего пера на CustomController
  4. Подключите все свои розетки и действия, как обычно, включая розетку UIView.
  5. В вашей инициализации CustomController.m загрузите перо

- (id)init {
    self = [super init];
    if (self != nil)
        [self loadNib];

    return self;
}

- (BOOL)loadNib {
    NSArray *topLevelObjs = nil;
    topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];

    if (topLevelObjs == nil) {
        NSLog(@"Error! Could not load nib file.\n");
        return NO;
    }
    return YES;
}

Новый контроллер на основе NSObject будет работать очень похоже на контроллер представления.

person wanderlust    schedule 01.04.2010
comment
К сожалению, это решение не добавляет CustomController в цепочку респондентов. - person titaniumdecoy; 06.04.2011
comment
Согласно справочным файлам Apple, я не думаю, что вам следует это делать. Вместо этого они предписывают, чтобы ViewController, содержащий все универсальные контроллеры, обрабатывал ответы. Я сейчас тоже в этом разбираюсь, поэтому, если я ошибаюсь, я хотел бы это услышать :) - person SpacyRicochet; 11.08.2011

Похоже, что вы хотите, это то, что я придумал «повторно используемые виджеты UIView» — многоразовые виджеты, которые что-то делают / представляют дисплей, который вы можете включать в свои экраны приложений, где и сколько раз, сколько хотите — вы можете создавать их просто в коде или создайте их экземпляры, поместив их фрейм в другой xib-файл (но вы не можете изменить внутренние параметры виджетов в xib-файле, для этого потребуется плагин IB).

Это организация, которую я никогда нигде не обсуждал. Часть моего разочарования на раннем этапе программирования для iOS заключалась в том, что я хотел чего-то подобного, но не видел способа выразить это в каком-либо примере.

См. мой ответ на этот вопрос, чтобы увидеть, как его можно структурировать:

UIView и initWithFrame и файл NIB. Как я могу загрузить файл NIB?

Я рекомендую поместить всю внутреннюю обработку виджета прямых/низкоуровневых событий в подкласс виджета uiview и реализовать протокол делегата для взаимодействия более высокого уровня с клиентом виджета (т. е. «loginRequested:userName:passWord» вместо ручного доступа к кнопке и текстовые поля внутри виджета).

У файла xib (необязательного, но рекомендуемого) для виджета есть владелец виджета, а код инициализации в виджете отвечает за загрузку файла xib. Клиент виджета просто создает экземпляр виджета и реализует любые функции делегата виджета, которые имеют для него смысл.

person Bogatyr    schedule 20.01.2012