Кнопка вызовет метод из другого класса, но обычный вызов метода не будет - PullRequest
0 голосов
/ 23 января 2011

С учетом того, как у меня все настроено в моем первом проекте для iPad, мне стало любопытно, почему обычные вызовы методов не работают так, как я думаю.

В представлении внутри initWithFrame я делаю указатель делегата следующим образом:

  mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate];

И сделайте такую ​​кнопку:

  CGRect backBTNFrame = CGRectMake(25, 30, 140, 52);
  backButton_video = [[UIButton alloc] init];
  backButton_video.frame = backBTNFrame;
  backBtnImg_video = [UIImage imageNamed:@"SHIP_button_back.png"];
  [backButton_video setImage:backBtnImg_video forState:UIControlStateNormal];
  backButton_video.backgroundColor = [UIColor clearColor];
  [self addSubview:backButton_video];

 [backButton_video addTarget:self
    action:@selector(kill_timers)
   forControlEvents:UIControlEventTouchUpInside];

 [backButton_video addTarget:del.switchVC 
     action:@selector(gotoMain)
 forControlEvents:UIControlEventTouchUpInside];

Я нажимаю кнопку, и она вызывает метод из контроллера представления:

- (void)gotoMain{

 NSLog(@"switch to main");

 for(UIView *v in [containerView subviews]) {
    [v removeFromSuperview];
 }

 MainMenu *mainMenu = [[MainMenu alloc] init];
 mainMenu.frame = CGRectMake(0, -20, 1024, 768);
 [containerView insertSubview:mainMenu atIndex:0];
 [mainMenu release];
}

Это избавляет от вида, в котором я находился, и добавляет вид главного меню. Это отлично работает.

Однако, если я сделаю указатель делегата, как это было раньше, и вызову метод self kill_timers и метод контроллера представления gotoMain, он не будет работать:

 mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate];

[self kill_timers];

[del.switchVC gotoMain];

В консоли я вижу сообщение, что он убивает таймер, что и делает, но у меня есть NSLog, готовый к запуску в контроллере вида, но ничего не появляется. Просто не бывает. Есть какие-нибудь подсказки? Почему кнопка и обычный вызов метода ведут себя по-разному?

1 Ответ

1 голос
/ 23 января 2011

Это «я» в «1001» буквально означает, что объект («я») должен что-то делать. То, что вы действительно хотите сделать, это попросить вашего делегата сделать что-то. Это не очень хорошая дизайнерская практика.

Если вы хотите, чтобы ваш делегат что-то сделал, используйте NSNotificationCenter.

В приложении AppDelegateDidFinishLaunching:

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(kill_timers)<br> name:@"Kill Timers"  object:nil];

Затем, когда вы хотите вызвать этого созданного наблюдателя:


[[NSNotificationCenter defaultCenter] postNotificationName:@"Kill Timers" object:nil];

Это вызовет метод, без грязных недостатков дизайна, связанных с наличием нескольких экземпляров вашего AppDelegate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...