通过我在第一个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准备在视图控制器中触发,但没有任何显示。只是没有发生。有线索吗?为什么按钮和常规方法调用的行为会有所不同?
答案 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的多个实例相关的混乱设计缺陷。