我是一名新程序员(我自己学习目标-c)。我正在尝试制作一个将使用倒数计时器作为主视图的iPad应用程序,然后使用警报根据我从数据库中提取的不同数据进入不同的视图。我已经工作了几天,我不能让这个计时器停在0并触发警报,允许用户进入下一个视图。它已启用ARC。
这里是.h:
的代码 #import <UIKit/UIKit.h>
@interface ViewController : UIViewController{
int eventTime;
NSDate *eventDate;
IBOutlet UILabel *timerLabel;
NSTimer *timer;
}
-(void)updateCountDown;
-(void)exercisePopup;
@end
而对于.m:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCountDown) userInfo:nil repeats:YES];
if(![timerLabel isEqual: 0]) {
[timer invalidate];
[self exercisePopup];
}
}
- (void)updateCountDown {
eventTime = 10;
eventDate = [NSDate dateWithTimeIntervalSinceNow:eventTime];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
int units = NSCalendarUnitHour | NSCalendarUnitMinute| NSCalendarUnitSecond;
NSDateComponents *components = [calendar components:units fromDate:[NSDate date] toDate: eventDate options:0];
[timerLabel setText:[NSString stringWithFormat:@"%ld%c:%ld%c:%ld%c", (long)[components hour], 'h', (long)[components minute], 'm', (long)[components second], 's']];
}
-(void)exercisePopup{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Time to Exercise" message:@"It's Time to Exercise, Touch the Screen" delegate:self cancelButtonTitle:@"Touch to Exercise" otherButtonTitles:nil];
// optional - add more buttons:
[alert show];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
我遇到的问题是让此计时器停在0以便警报响起。如果我离开!在if语句中,当应用程序打开时,警报会立即触发,但倒计时永远不会启动。如果我把它拿出来,倒计时会永远变成负数等等。我不确定if语句检查是什么,因为它似乎认为timerLabel从0开始。我还尝试移动if语句,甚至将其作为自己的方法然后在计时器加载后尝试调用它,但我尝试过的任何工作都没有。
我完全迷失了,我已经尝试了过去几天我在这里找到的所有解决方案,而且没有一个能够解决我想做的事情,我&# 39;当我实施它们时,我们遇到了各种各样的错误。如果有人有任何建议,我真的很感激。
答案 0 :(得分:0)
if(![timerLabel isEqual: 0]
这一行是你的问题。您正在将UILabel与0进行比较,这与检查此UILabel是否为nil相同,而不是viewDidLoad
,因为您正在从存在此标签的nib文件中加载。所以[timerLabel isEqual:0]
总是等于false,这就是为什么否定整个if语句会使警报触发。你需要考虑另一种计算NSTimer
射击的10次重复的方法。
尝试使用该方法中声明的updateCountDown
来计算static int
被解雇的次数。
答案 1 :(得分:0)
看来你在这里误解了一些事情。
计划流程:
当你实例化你的计时器时,它会自行关闭,然后每隔1.0
秒调用你的选择器。原始执行继续正常,检查您的状况,然后退出viewDidLoad
。你永远不会再次检查病情。这是您活动的基本顺序:
- 您创建了一个计时器。
- 您检查
timerLabel
是否不是0
。- 一秒钟之后,您的计时器会启动,执行
醇>updateCountDown
。
您的exercisePopup
方法永远不会被调用,因为您未在updateCountDown
中检查您的状况。
对象比较:
使用timerLabel
和isEqual:
整数文字0
的比较与您写的相同:
if (![timerLabel isEqual:nil]) {
这显然不是你想要的;您正尝试将与timerLabel
关联的字符串值与字符串值@"0"
进行比较。
if (![timerLabel.text isEqualToString:@"0"]) {
然而,这不是比较时间的最佳方式。您应该考虑使用NSTimeInterval
并进行比较。您可能还希望使用CADisplayLink
在显示屏上安排时间更新,以便您不会等待可能不同步的计时器。
答案 2 :(得分:0)
我把这段代码放在一个示例项目中,它可以工作。搏一搏。我对你要做的事做了一些细微的改动。你做错了几件事。检查计时器是否为0的if语句在viewDidLoadMethod期间被调用,在启动计时器后立即调用它。
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *timerLabel;
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic) NSInteger currentTime;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.currentTime = 10;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];
}
- (void)updateTimer
{
NSDate *eventDate = [NSDate dateWithTimeIntervalSinceNow:self.currentTime];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
int units = NSCalendarUnitHour | NSCalendarUnitMinute| NSCalendarUnitSecond;
NSDateComponents *components = [calendar components:units fromDate:[NSDate date] toDate: eventDate options:0];
[self.timerLabel setText:[NSString stringWithFormat:@"%ld%c:%ld%c:%ld%c", (long)[components hour], 'h', (long)[components minute], 'm', (long)[components second], 's']];
self.currentTime--;
if (self.currentTime == 0)
{
[self.timer invalidate];
[self exercisePopup];
}
}
-(void)exercisePopup{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Time to Exercise" message:@"It's Time to Exercise, Touch the Screen" delegate:self cancelButtonTitle:@"Touch to Exercise" otherButtonTitles:nil];
// optional - add more buttons:
[alert show];
}
@end