Цель C: открыть и закрыть вложенный просмотр

#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 я не могу его использовать, потому что этот метод находится в другом классе, вы понимаете?