按钮将调用不同类的方法,但常规方法调用不会
问题描述:
随着我在第一个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。
谢谢..我想你可能误解了,但你的答案仍然适用。 kill_timers应该在同一个类中被调用。它的gotoMain应该在另一个班级中被调用。我明天应该可以做到这一点,并让你知道它是否可行。 – VagueExplanation 2011-01-23 06:09:59