使用NSTimer制作闹钟

3

我刚刚尝试使用本地通知制作闹钟应用,但这并没有起到作用,因为我需要一个弹出警报而不是它进入 iOS 5+ 的通知中心。

到目前为止,我一直在苦苦挣扎 nstimer 及其函数,所以我想知道是否有人可以帮忙。

当用户通过 UIDatePicker(仅限时间)选择时间时,我希望在正好这个时间显示一个警报。我已经弄清楚了如何从 UIDatePicker 获取时间,但我不知道如何正确设置 nstimer 的触发函数。以下是我迄今为止尝试的内容,如果有人能帮忙...将不胜感激。谢谢

示例(它每秒都会进入函数,而不是我告诉它的某个特定时间...这不是我想要的):

NSDate *timestamp;
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];

[comps setHour:2];
[comps setMinute:8];
timestamp = [[NSCalendar currentCalendar] dateFromComponents:comps];

NSTimer *f = [[NSTimer alloc] initWithFireDate:timestamp
                             interval:0
                               target:self
                             selector:@selector(test)
                             userInfo:nil repeats:YES];

NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer:f forMode: NSDefaultRunLoopMode]; 

对于一个闹钟应用程序,你无法在开始时确定用户是否会重复(贪睡)。因此,在第一次创建计时器时,你无法做出这个决定。当闹钟响起(test)时,你将需要决定是否创建一个新的计时器,其中包括贪睡时间间隔 - Nate
@Nate 好的,非常感谢你的回复,但这并没有解决它每秒钟重复触发的问题...为什么它不在2:08时执行而是每秒钟都执行呢? - Alex G
实际上,您做了一些非常奇怪的事情。您设置了repeats = YES,但间隔interval = 0。这其实没有太多意义。因此,也许计时器会默认将一些非零时间用于避免在test之间进行大量调用而不留间隔,以避免使CPU过载。 - Nate
我猜如果“贪睡”按钮只允许您贪睡一段特定的时间(例如10分钟),您可以像所做的那样设置定时器,使其火灾日期等于应该关闭的时间。然后,间隔将为10分钟。重复可以是YES。然后,如果用户决定不要贪睡,您可以简单地取消计时器。这可能管用。 - Nate
不是在接收任务和调用 test 之间。test 方法将在触发日期被调用。如果 repeats = YES,则在 interval 后它将再次被调用。请参阅此处的苹果文档中的 NSTimer 说明。 - Nate
显示剩余2条评论
1个回答

2

正如@Nate所说,需要进行更改

NSTimer *f = [[NSTimer alloc] initWithFireDate:timestamp
                             interval:0
                               target:self
                             selector:@selector(test)
                             userInfo:nil repeats:YES];

To

NSTimer *f = [[NSTimer alloc] initWithFireDate:timestamp
                             interval:0
                               target:self
                             selector:@selector(test)
                             userInfo:nil repeats:NO]; //<-- Change here

所以你想要的是,如果你设置了一个2:08的闹钟,它应该在接下来的几天重复响起? - Janak Nirmal
是的。我现在只是举个例子,2:08的时间实际上将由用户决定。谢谢。 - Alex G
真的吗?如果应用程序在后台被暂停,NSTimer 将无法工作?对于应用程序被关闭,我已经警告过我的用户不要这样做,因为苹果有限制。 - Alex G
@AlexG,Jennis是对的。一旦你进入后台,你的NSTimer对象将停止触发。因此,如果你的应用程序应该被打开来设置闹钟,然后关闭很长时间...而闹钟稍后响起,那么NSTimer对你来说将无法工作。 - Nate
@AlexG,他们是苹果公司,因此可以做第三方应用程序无法做到的事情:)。我知道这不公平! - Nate
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接