Подкласс UIViewController или создайте пользовательский объект NSObject, когда представление не полноэкранное - PullRequest
4 голосов
/ 19 января 2012

Мне нужно создать контроллер класса для управления поведением пользовательского представления, которое я создал.Стандартный подход заключается в создании подкласса UIViewController, но в моем случае я вместо этого решил подклассировать NSObject, по существу, по трем причинам:

  • мое представление должно быть добавлено как небольшое подпредставление контроллера основного представления (оно будетне будет отображаться с использованием чего-то вроде presentModalViewController или pushViewController ...), и для него не требуется никакой панели инструментов или элемента управления навигацией внутри него
  • Скорее всего, мой контроллер не нужно будет уведомлять об ориентации устройства, потому что его видбудет всегда использоваться в портретном формате, поэтому мне не интересно получать обычные сообщения поворота willRotateToInterfaceOrientation и т. д. *
  • Мне нужно, чтобы этот класс был как можно более легким, сводя к минимуму потребление памяти.Отсутствие подклассов UIViewController имеет преимущество в получении более легкого класса без набора методов, которые мне никогда не понадобятся

Интерфейс моего контроллера довольно прост, пример:

@interface MyScrollTabBarController : NSObject <MyTabBarViewDelegate> { }

/**
 * The view is created internally by the controller and the client class
 * can access to it in readonly mode
 */
@property (nonatomic, readonly) UIView *view;

/**
 * A Property to change the view appearance
 */
@property (nonatomic, assign) MyScrollTabBarViewState viewState;

/**
 * Others properties used to construct the view's subviews
 */
@property (nonatomic, retain) Location *rootLocation;
@property (nonatomic, readonly, retain) Place *place;

/**
 * Designated initializer
 */
- (id)initWithPlace:(Place *)aPlace;

- (void)setRootLocation:(Location *)location animated:(BOOL)animated;

@end

Чтобы отобразить его внутренний вид из родительского контроллера представления, я буду использовать что-то вроде этого:

tabBarController = [[MyScrollTabBarController alloc] initWithPlace:aPlace];
tabBarController.viewState = MyScrollTabBarViewStateXX;
tabBarController.view.frame = CGRectMake(...); 
[self.view addSubview:tabBarController.view];

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

Спасибо

Ответы [ 4 ]

1 голос
/ 19 января 2012

Да, это правильный подход.

UIViewControllers специально предназначены для управления полноэкранными представлениями, а не для вспомогательных экранов.В iOS5 есть механизм для создания подэкранных контроллеров представления таким образом, но это не доступно в iOS4 без большого количества хакерских атак.

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

1 голос
/ 19 января 2012

Я думаю, что это приемлемое решение.

Другим решением было бы создание «толстого» представления, которое само себя контролирует (как, например, MKMapView, UITextView и т. Д.). Это может сделать вещи немного более управляемыми, и если представление является очень специализированным, и его контроллер предназначен для работы только с этим одним классом представления, вы на самом деле не теряете возможность повторного использования (потому что его немного). 1003 *

0 голосов
/ 19 января 2012

Привет. Вы создаете подкласс NSObject и объявляете UIView внутри него

@interface MyScrollTabBarController : NSObject <MyTabBarViewDelegate> { }

@property (nonatomic, readonly) UIView *view;

Предлагаю вам создать подкласс UIView, чтобы вам не пришлось объявлять дополнительный объект вида.

так что вместо self.view вы можете просто сослаться на self

tabBarController = [[MyScrollTabBarController alloc] initWithPlace:aPlace];
tabBarController.viewState = MyScrollTabBarViewStateXX;
tabBarController.frame = CGRectMake(...); 
[self.view addSubview:tabBarController];
0 голосов
/ 19 января 2012

что вы обычно делаете, когда вам нужно написать контроллер для представления, которое не является полноэкранным, как у меня

Не важно, что ваш вид не отображается в полноэкранном режиме. Возможно (и обычно) иметь представления, состоящие из подпредставлений, каждое из которых имеет свой собственный контроллер.

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

Создание подклассов UIViewController не потребляет чрезмерное количество памяти, поэтому это не должно быть частью рассмотрения.

[...] если вы считаете, что в этом могут быть недостатки [...]

С вашим решением вы теряете гибкость. Вполне вероятно, что вы будете повторно использовать свое решение в контексте, в котором вам нужно отвечать на UILifecyle-Messages или использовать другие функции UIViewController.

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

...