UIViewController или UIView - какой из них должен создавать подпредставления? - PullRequest
6 голосов
/ 11 ноября 2008

Я пытаюсь обернуться вокруг ролей UIViews и UIViewControllers. Если я создаю и вставляю подпредставления программно, это обычно делается из представления или из контроллера?

Мне просто интересно, есть ли соглашение / шаблон для этого. В моем примере приложения я загружаю 50 изображений во время выполнения, добавляю их в качестве подпредставлений в основной вид, а затем позволяю пользователю перетаскивать их по экрану. В настоящее время я делаю всю инициализацию в представлении initWithCoder:

- (id)initWithCoder:(NSCoder*)coder 
{
    if (self = [super initWithCoder:coder]) {
      // load UIImageViews and add them to the subview
    }

    return self;
}

В представлении также реализованы функции touchsBegan / touchesMoved, позволяющие перетаскивать. Моя проблема возникает, когда я пытаюсь получить доступ к [self frame] .size в initWithCoder, похоже, он еще не инициализирован. Это заставляет меня думать, что я могу загружать изображения не в том месте ...

Ответы [ 4 ]

7 голосов
/ 11 ноября 2008

Это зависит от того, что вы делаете. Если представление представляет что-то «упакованное», то вы создаете подпредставления из самого представления. Если вы просто объединяете представления вместе, то вы должны сделать это из контроллера представления.

Подумайте о традиционной инкапсуляции. Является ли ваше подпредставление концептуально «частью» его суперпредставления, или оно просто существует в иерархии рисунков?

2 голосов
/ 11 ноября 2008

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

2 голосов
/ 11 ноября 2008

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

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

1 голос
/ 26 июня 2011

Пустое объяснение было бы так:

Подкласс UIViewController всякий раз, когда вы планируете отображать представление как модальное (presentModalViewController) или внутри UINavigationController (pushViewController)

Подкласс UIView, когда это маленький компонент внутри основного вида ... например, вы хотите сделать пользовательскую кнопку или ...

Более конкретно, в вашем примере ... если вы инициализируете UIViewControllers, вы можете установить свойства вида, например. нравится размер кадра только после того, как ваш вид добавлен в superview. Только в этот момент UIViewController загружает и инициализирует свой вид.

Я думаю, что в вашем случае вы должны использовать UIViews ... вы можете установить размер кадра сразу после их выделения и инициализации.

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