编辑:从我的代码中添加NSRunLoop,如下面的Deepak所述。这是最初在我的代码中,忘记添加,因为它已被注释掉。设置从另一个类的计时器在另一个视图中触发
我有2个类:MainViewController和ConfigViewController。用户切换到ConfigView并使用UIDatePicker/UIButton组合来设置日期/时间。一旦从对象的UIDatePicker抓住正确的时间,我设置一个的NSTimer火按照以下代码:
ConfigViewController.m
-(IBAction)setAlarmDate:(id)sender {
//Instantiate to get access to doAlarm:
MainViewController *mvc = [[MainViewController alloc] init];
dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateStyle:NSDateFormatterMediumStyle];
[dateFormat setTimeStyle:NSDateFormatterShortStyle];
NSString *target = [NSString stringWithFormat:@"%@",[dateFormat stringFromDate:datePicker.date]];
alarmDate = [datePicker date];
mvc.fireTimer = [[NSTimer alloc]
initWithFireDate:alarmDate interval:1 target:mvc
selector:@selector(doAlarm:) userInfo:nil repeats:YES];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:mvc.timer forMode:NSDefaultRunLoopMode];
[self dismissModalViewControllerAnimated:NO];
}
的doAlarm:方法如下:
MainViewController.m
- (void)doAlarm:(NSTimer *)timer {
NSLog(@"Called doAlarm:");
UIImage *ac = [UIImage imageNamed:@"alarmclock.png"];
[self.alarmview setImage:ac];
[self.alarmview setHidden:NO];
[self.view addSubview:alarmview];
[self.view bringSubviewToFront:alarmview];
}
然而,当我设置闹钟日期,定时器不能触发。我认为以下问题正在进行:
1)我正在实例化一个MainViewController类的新实例,将Timer设置为,然后将控件传回MainViewController的“原始”实例(当我关闭MVC时)。在这一点上,MainViewController的“新”实例可能只是一个悬挂指针,并且不会再被引用,因此没有段错误。
2)doAlarm:引用self.view,这是应该是MainViewController.view,但因为它在ConfigViewController的示波器的实例,报警图像将永远不会看到反正...
我想我的理论有些没有根据,但是凭借我目前的知识水平,他们对我来说很有意义。
上面提到的任何光线都会被粉碎。
非常感谢!
swisscheese。
谢谢Deepak - 我确实注意到initWithFireDate需要将定时器添加到RunLoop中。我相应地编辑了我的代码。通过弱引用,我应该实例化一个MainViewController的“全局”实例(如重复的实例),@property it_weak,然后用新实例替换所有对self的引用?我确信我在这里忽略了OOP的一些基本原则,因为我似乎正在通过跨级消息来限制我的知识。也许我应该只用一种新的闹钟方法,然后看看我是否能到达那里。再次感谢! – swisscheese 2011-05-22 16:20:21
我已在相应部分的答案中添加了关于“MainViewController”的含义。 – 2011-05-22 16:41:09
谢谢迪帕克 - 仍然没有任何运气,它只是默默拒绝执行该方法。我试图在本地方法中代理调用,并且我可以确认可以使用Timer/RunLoop设置调用代理方法。从这个代理方法,以及一个NSLog记录我在方法中,我也尝试[mvcReference doAlarm],但不幸的是没有任何反应 - 我会继续挖掘,但我想我可能不得不重新设计我的整个应用程序基于此问题。谢谢你的帮助。 – swisscheese 2011-05-22 17:40:37