#objective-c #subview #ibaction
#objective-c #вложенное представление #ibaction
Вопрос:
Это мой код с двумя IBAction для открытия и закрытия вложенного представления в двух разных классах
- (IBAction) showListClient:(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];
}
теперь в первый раз все в порядке, но если я хочу использовать свой список больше времени, я должен записать в closeListClient
list = nil;
[list release];
теперь моя проблема в том, что этот «список» объявлен только в классе ListClient как
ListClient *list;
и когда я пишу список в CloseListClient, возникает ошибка…что я могу сделать?
Ответ №1:
В ListCLient.h определите протокол для его делегата:
@protocol ListClientDelegate<NSObject>
@optional
- (void)listClientDidClose:(ListClient *)listClient;
@end
и изменить определение свойства для delegate
:
@property (nonatomic, assign) id<ListClientDelegate> delegate;
Затем отправьте сообщение делегату при вызове действия closeListClient (в ListClient.m):
-(IBAction)closeListClient {
[self.view removeFromSuperview];
[self.delegate listClientDidClose:self]
}
Затем, наконец, в someController.m реализовать метод делегирования:
-(void)listClientDidClose:(ListClient *)listClient {
[list release];
list = nil;
}
Я надеюсь, что это решит вашу проблему.
Ответ №2:
Я хотел бы указать на несколько проблем, которые могут решить вашу проблему. Я немного запутался в вашем вопросе, особенно в формулировке открытия и закрытия представления. Я уверен, что вы просто хотите скрыть и показать представление, основанное на том, какая кнопка нажата.
Этот код неверен
-(IBAction)closeListClient {
[self.view removeFromSuperview];
}
//I am sure you want to remove the list view
-(IBAction)closeListClient {
[list.view removeFromSuperview];
}
И операции выпуска и nil здесь выполняются в обратном порядке
list = nil;
[list release];
//Change to
[list release];
list = nil;
В итоге вы должны получить
-(IBAction)closeListClient {
[list.view removeFromSuperview];
[list release];
list = nil;
}
Комментарии:
1. хорошо, но я использую showListClient и closeListClient в двух разных классах, затем, когда я использую «list» в showListCient, это нормально, но в closeListClient я не могу его использовать, потому что этот метод находится в другом классе, вы понимаете?