我一直在试图弄清楚如何设置NSTimer以允许我在视图中的UILabel中打印当前时间,并让它每秒更新一次(不需要更精细的分辨率 - 只需一个简单的时钟)。
起初,我没有使用NSRunLoop,但如果我尝试包含一个,则执行只是在循环内“旋转”,阻止进一步执行。我在下面发布了我的代码。
-(id) printCurrentTime {
now = [NSDate date];
dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeStyle:NSDateFormatterMediumStyle];
NSString *nowstr = [dateFormat stringFromDate:now];
[dateFormat release];
NSLog(@"Current time is: %@",nowstr);
return nowstr;
}
在ViewController源文件中,我按照:
执行TimeStuff *T = [[TimeStuff alloc] init];
NSString *thetime = [T printCurrentTime];
[timelabel setText:thetime];
[T release];
[self.view addSubview:timelabel];
NSTimer *timmeh = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(printCurrentTime) userInfo:nil repeats:YES];
[[[NSRunLoop currentRunLoop] addTimer:timmeh forMode:NSDefaultRunLoopMode] run];
“TimeStuff”类实际上是一个空类,除了printCurrentTime函数。
问题:
1)我应该在AppDelegate类中包含RunLoop吗?我无法想象这一切应该如何挂在一起,例如 - 基于Timer实现循环的步骤是什么,以最新的时间更新文本标签。很难过。
2)如果我应该使用NSThread,那么它也应该在它自己的类/ Delegate类中。
3)ViewController类是否完全超出了循环/定时器的界限,只是“eye candy”类,在Delegate类中回调函数?
感谢您的时间和耐心。
答案 0 :(得分:2)
您根本不需要处理运行循环。
这一行:
NSTimer *timmeh = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(printCurrentTime) userInfo:nil repeats:YES];
将创建一个计时器并将其附加到当前线程的运行循环中。您根本不需要[NSRunLoop addTimer:forMode:]
来电 - 您可以删除该行。
PS你当然不需要像NSThreads那样!
编辑关于你的评论:
如果这是printCurrentTime方法所在的位置,则需要为计时器创建一个TimeStuff类的实例。即。
@interface MyViewController : UIViewcontroller {
TimeStuff *timeStuff
}
并在viewDidLoad方法中:
- (void)viewDidLoad {
[super viewDidLoad];
...
// Create our timestuff if we don't have one already
if (nil == timeStuff)
timeStuff = [[TimeStuff alloc] init];
// Start the timer
[NSTimer scheduledTimerWithTimeInterval:1.0 target:timeStuff selector:@selector(printCurrentTime) userInfo:nil repeats:YES];
并且不要忘记dealloc
- (void)dealloc {
[timeStuff release];
...
[super dealloc];
}
传递timeStuff作为计时器的目标告诉它在哪里寻找printCurrentTime方法!
希望有所帮助,
PS所有行@class TimeStuff
都告诉编译器有一个名为TimeStuff的类。它不知道您想将它用于计时器的选择器!