objective C: проблема с открытием вложенного представления во второй раз

#objective-c #xcode #uitableview #subview

#objective-c #xcode #uitableview #вложенный

Вопрос:

У меня есть этот код для открытия вложенного представления

 - (IBAction) showList:(id) sender {

if( list == nil){

    list = [[ListClient alloc] initWithNibName:@"ListClient" bundle:nil];
    [list setDelegate:self];
    [self.view addSubview:list.view];
}
}
  

и этот код для закрытия этого вложенного представления

 -(IBAction) closeListClient {
[self.view removeFromSuperview];
  

}

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

Ответ №1:

Потому что у вас это list не nil так что оно не попадает внутрь if (list == nil) .

Измените его на if (list.superview == nil) .

Комментарии:

1. Хотя это сработает, при каждом вызове ListClient объекта будет происходить утечка……….. showList объект………..

Ответ №2:

Это из-за if инструкции. Измените его на:

 if ( list == nil ) {
    list = [[ListClient alloc] initWithNibName:@"ListClient" bundle:nil];
    [list setDelegate:self];
}
[self.view addSubview:list.view];
  

И это сработает.

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

 self.list = [[[ListClient alloc] initWithNibName:@"ListClient" bundle:nil] autorelease];
  

И вы можете сказать self.list = nil; освободить объект, когда закончите с ним. (например, при отклонении или в вашем dealloc методе)

Ответ №3:

 -(IBAction) closeListClient{
[self.view removeFromSuperview];
if ( list != nil ) {
    [list release];
    list=nil;
}}
  

Комментарии:

1. Хотя это сработает, ListClient объект будет пропускаться каждый раз, когда он будет отклонен.