iPhone: [релиз subview] удаляет мое подпредставление с дисплея - PullRequest
0 голосов
/ 19 мая 2010

У меня есть эти две части кода. Первый работает отлично:

UIView *tmp = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 60.0f, 296.0f, 44.0f)];
[self.dynamicView addSubview:tmp];
[tmp release];

Второй почти такой же, но вид не отображается.

CommentBox *commentBox = [[CommentBox alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 296.0f, 44.0f)]; 
[self.dynamicView addSubview:commentBox];
[commentBox release];   // Why does this remove the view?

Если я удаляю [commentBox release], вид неожиданно появляется. Но я не вижу различия между этими двумя фрагментами кода.

Инициализация для CommentBox выглядит следующим образом:

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // Load the nib:
        NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CommentBox" owner:self options:nil];
        self = [nibObjects objectAtIndex:0];

    }
    return self;
}

Ответы [ 2 ]

3 голосов
/ 19 мая 2010

Подумав об ответе Грэма, я нашел следующее решение:

  1. Я перетаскиваю новый UIView (-> давайте назовем его sub UIView) в Интерфейсном Разработчике в моем основном UIView
  2. Я присваиваю этому подпункту UIView правильный размер (потому что я не могу изменить размер основного UIView, который всегда равен 320x460)
  3. Я перетаскиваю все остальные мои элементы в этот подпункт UIView (чтобы все элементы были прикреплены к моему подпунктуUIView)
  4. Я присваиваю своему подчиненному UIView номер тега (Interface Builder -> View Attributes), например, «300»
  5. В коде, который я сейчас делаю, в моем -initWithFrame:

    NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed: @ "CommentBox" владелец: собственные параметры: ноль];UIView * subView = [[nibObjects objectAtIndex: 0] viewWithTag: 300];[self addSubview: subView];

Надеюсь, это поможет.


Обновление:

У меня только что был другойИдея сделать это.Вместо номеров тегов вы также можете создать IBOutlet UIView *viewHolder в классе CommentBox и установить выход в IB.Затем в initWithFrame: я делаю следующее:

[[NSBundle mainBundle] loadNibNamed:@"CommentBox" owner:self options:nil];
[self addSubview:self.viewHolder];
2 голосов
/ 19 мая 2010

Вы делаете странные вещи в -initWithFrame:. Я не уверен на 100%, что это вызывает проблему, о которой вы сообщаете, но я уверен, что это:

  • неправильно; и
  • вызывает утечку памяти.

Я не думаю, что замена объекта просмотра чем-то, разархивированным из nib в его -init… методах - это хорошая идея. Либо загрузите перо из класса контроллера, либо попросите инициализатор загрузить подпредставления объекта из кончика без замены self.

...