按钮将调用不同类的方法,但常规方法调用不会

按钮将调用不同类的方法,但常规方法调用不会

问题描述:

随着我在第一个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]; 
} 

这使我摆脱了视图,并添加了主菜单视图。这工作正常。

但是,如果我做一个委托指针像以前的样子,并调用自法kill_timers和视图控制器方法gotoMain,它不会工作:

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

[self kill_timers]; 

[del.switchVC gotoMain]; 

在控制台中我看到的消息它杀死了它的计时器,但我有一个NSLog准备好在视图控制器中触发,但没有任何显示。只是不发生。任何线索?为什么按钮和常规方法调用的行为不同?

[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。

+0

谢谢..我想你可能误解了,但你的答案仍然适用。 kill_timers应该在同一个类中被调用。它的gotoMain应该在另一个班级中被调用。我明天应该可以做到这一点,并让你知道它是否可行。 – VagueExplanation 2011-01-23 06:09:59