Где позвонить [self addSubView]? - PullRequest
       2

Где позвонить [self addSubView]?

6 голосов
/ 04 января 2012

У меня есть пользовательское представление, к которому мне нужно добавить пару подпредставлений программно.Как лучше всего создать и добавить эти подпредставления? Apple docs скажем:

Если ваш класс представлений управляет одним или несколькими интегральными подпредставлениями, выполните следующие действия: Создайте эти подпредставления во время последовательности инициализации представления.

Это немного неясно для меня.Должен ли я обрабатывать это в initWithFrame, initWithCoder или где-то еще?

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

Ответы [ 4 ]

9 голосов
/ 04 января 2012

initWithFrame - это метод, который вызывается для программного создания UIView, а initWithCoder вызывается, когда UIView создается из XIB.

Так что все зависит от того, как вы собираетесь создать свой содержащий вид. Способ охватить все дела:

- (id) initWithFrame:(CGRect)frame
{
    if ((self = [super initWithFrame:frame])){
         [self setUpSubViews];
    }
    return self;
}

- (id) initWithCoder:(NSCoder*)aDecoder 
{
    if ((self = [super initWithCoder:aDecoder])){
         [self setUpSubViews];//same setupv for both Methods
    }
    return self;
}

- (void) setUpSubViews
{
     //here create your subviews hierarchy
}
3 голосов
/ 04 января 2012

Сделайте следующее: возьмите метод, какой бы ни был назначенный инициализатор для вашего представления.То есть это наиболее настраиваемый (то есть большинство аргументов) метод init ..., который вызывает любой другой инициализатор.Например, это может быть -initWithFrame :, как обычно.Затем реализуйте этот метод следующим образом:

- (id) initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // add new views here, for example:
        UIImageView *imageView = [[UIImageView alloc] initWithImage:anImage];
        [self addSubview:imageView];
        [imageView release];
    }
    return self;
}
0 голосов
/ 04 января 2012

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

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

Как правило, вы должны создать представление и [self addSubView] в viewdidload / viewwillappear родительского контроллера представления, если вы хотите постоянно показывать представление.Вы также можете установить его скрытым, если хотите.В каком-то другом сценарии, например, когда вы хотите показать представление по нажатию кнопки или другим действиям, вы должны соответствующим образом добавить подпредставления.

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