#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
объект будет пропускаться каждый раз, когда он будет отклонен.