Button将从不同的类调用方法,但常规方法调用不会

时间:2011-01-22 23:18:39

标签: iphone ipad class

通过我在第一个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 个答案:

答案 0 :(得分:1)

[self kill_timers];
中的自我字面上意味着对象(自我)被告知要做某事。你真正想做的是告诉你的代表做点什么。这不是一个好的设计实践。

如果您希望代理人做某事,请使用NSNotificationCenter。

在AppDelegate的applicationDidFinishLaunching中:

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

然后,当你想要调用这个创建的观察者时:


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

这将启动该方法,而不会产生与AppDelegate的多个实例相关的混乱设计缺陷。