2009-06-24 1 views
1

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

super_view -> subview1 -> subview2 -> subview3

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

[subview1 removeFromSuperview]; 

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

Есть ли способ, позволяющий subviews знать, что их супер-вид удален?

ответ

0

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

EDIT:

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

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

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

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

+0

В документации для removeFromSuperView говорится: «Приемник также выпущен;». Не выпускает ли релиз его подвид? – MAbbas

5

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

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

UIView* subview2 = [[UIView alloc] initWithFrame:myFrame]; 
[subview1 addSubview:subview2]; 
[subview2 release]; 
+0

+1, Джейн - отличный веб-сайт/компания/жизнь ... Я был заинтригован из-за вашего ответа и ... – stefanB

+0

Well Jane, Как вы упомянули, я освобождаю subview после добавления его в супер-представление. Но когда я удаляю супер-просмотр, скажите «subview1» на [self removeFromSuperView]; // Удаление subview1 из его супервизора dealloc для subview2 не вызывается. В документации для «removeFromSuperView» упоминается, что callin также выпустит его. Я что-то упустил? Thanx, – MAbbas

+0

У вас должен быть дополнительный удержание на subview2 - не видя кода, который я могу сказать, извините. И голосуете за мою жизнь? Мне это нравится, хотя я уверен, что должен вернуть точку или что-то еще :-) –

0

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

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

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 приложение будет крах, поскольку оба OBJETS имеет retainCount = 0 ,

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

1

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

@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 

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

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

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

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

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

Имейте в виду, однако, что если вы действительно хочет, чтобы знать, когда они больше не на экране на всех (и тот факт, что они не имеют SuperView вторична по отношению к вашей цели), все подпункты будут уведомлены через зеркала 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 
Смежные вопросы