Удаление View из его SuperView, уведомление о просмотрах на iPhone - PullRequest
1 голос
/ 24 июня 2009

Какое событие вызывается при удалении представления из суперпредставления? Получают ли его подпункты какое-либо сообщение? Например, у меня есть subview2 и subview3, добавленные в subview1, как в

super_view -> subview1 -> subview2 -> subview3

если я удалю subview1, например, от

[subview1 removeFromSuperview]; 

Какое событие получают его подпредставления (subview2 и subview3)?

Есть ли способ сообщить подпредставителям, что их суперпредставление удалено?

Ответы [ 4 ]

5 голосов
/ 25 июня 2009

Это зависит от количества сохраненных подпредставлений2 и подпредставлений3. Если вы создадите их с помощью [[UIView alloc] initWithFrame: frame], а затем добавите их в качестве подпредставлений, они будут иметь счет сохранения 2. (Или 3, если вы сохраните ссылку в сохраненном свойстве, то есть self.subview2 = [[...

Так что, если вы хотите, чтобы они были выпущены при выпуске subview1, убедитесь, что вы даете им еще один выпуск после добавления их в качестве подпредставления, так что их счет сохранения является единственным из добавленных в качестве подпредставления. Как то так ...

UIView* subview2 = [[UIView alloc] initWithFrame:myFrame];
[subview1 addSubview:subview2];
[subview2 release];
1 голос
/ 27 августа 2015

Поскольку этот вопрос все еще открыт, вот ответ:

@implementation MySubview
- (void)willMoveToSuperview:(UIView *)newSuperview {
  if (!newSuperview) {
    // I'm being removed from my superview.
  }
}
- (void)didMoveToSuperview {
  if (!self.superview) {
    // I no longer have a superview.
  }
}
@end

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

@implemenation MySuperview
- (void)willRemoveSubview:(UIView *)subview {
  // I'm about to remove this view.
}
@end

Какое событие получают его подпредставления (subview2 и subview3)?
subview1 уведомляется, но subview2 и subview3 необходимо, чтобы это сообщение было передано subview1 (что не делается автоматически).

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

@implementation UIView (superview_notification)
- (void)notifyMyChildrenAboutTheSuperviewChange {
  [[self subviews] makeObjectsPerformSelector:@selector(notifyMyChildrenAboutTheSuperviewChange)];
}
@end

Имейте в виду, однако, что если вы действительно хотите знать, когда их больше нет на экране (а тот факт, что у них нет супервизора, является вторичным по отношению к вашей цели), подпредставления будут уведомлены через UIWindow зеркала вышеуказанных методов.

@implementation MySubview
- (void)willMoveToWindow:(UIWindow *)newWindow {
  if (!newWindow) {
    // I'm being removed from the screen.
  }
}
- (void)didMoveToWindow {
  if (!self.window) {
    // I'm offscreen.
  }
}
@end
0 голосов
/ 09 августа 2009

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

Посмотрите на следующий фрагмент кода:

randomImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"oldbg.png"]];
randomImage.frame = CGRectMake(10, 10, 20, 20);

aview = [[UIView alloc] initWithFrame:CGRectMake(0,0, 320, 200)];

NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);

[aview addSubview:randomImage];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);
[randomImage release];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);


[self.view addSubview:aview];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);
[aview release];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);

[aview removeFromSuperview];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);

И журнал консоли выглядит так:

 2009-08-09 23:29:42.512 ActionSheetTest[744:20b] aview retain=1,image retain=1
2009-08-09 23:29:42.513 ActionSheetTest[744:20b] aview retain=1,image retain=2
2009-08-09 23:29:42.515 ActionSheetTest[744:20b] aview retain=1,image retain=1
2009-08-09 23:29:42.516 ActionSheetTest[744:20b] aview retain=2,image retain=1
2009-08-09 23:29:42.517 ActionSheetTest[744:20b] aview retain=1,image retain=1

на самом деле при последнем NSLog приложение завершится сбоем, поскольку оба объекта имеют retainCount = 0.

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

0 голосов
/ 24 июня 2009

Я не думаю, что subviews (2,3) получат какое-либо событие, когда subview1 будет удален как таковой (по крайней мере, ничего не упомянуто в документации).

EDIT

Думая об этом больше ... Я полагаю, что подпредставления (2,3) не получат событие само по себе, когда будет выпущено подпредставление1.

Но как побочный эффект освобождения subview1, если subview1 не сохраняется где-то еще, его количество ссылок достигнет 0, и он будет освобожден. Во время освобождения subview1 выпустит все свои подпредставления.

В этом случае они будут освобождены, я не уверен, что это то, что вы ищете.

См. Ответ Джейн.

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