UIViewController против UIView-какой из них должен создавать подвиды?

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

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

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

    return self;
}

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

4 ответов


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

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


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

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


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


фиктивное объяснение было бы так:

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

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

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

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