Objective c 当当前分钟的值发生变化时(使用Cocoa),如何显示时间?
好吧,这件事真让我难堪。这个挑战看起来很简单,但有一些限制,真的让我很反感 节目要点: (1) 当分钟更改时,应用程序应以HH:mm:ss格式输出当前时间 (2) 当第二次更改时,应用程序应每秒钟输出一个字符,每十秒钟输出一个不同的字符(即“…..…..…..…..”)。这里重要的是要注意,我不能只数秒;相反,程序必须知道当前时间的秒的值,并且仅当它可以被10整除时才输出相应的字符 限制: (1) 该程序可以有两个类——一个用于分钟显示,另一个用于第二次显示 (2) 每个类只能包含一个以计时器为参数的void方法 (3) main函数将为每个类创建一个对象和2个NSTimer第一个计时器的间隔必须设置为0.5,并且必须以分钟对象为目标。第二个计时器的间隔必须设置为0.1,并且必须以秒对象为目标。 我很想把第一个时间设定为每分钟启动一次,第二个计时器设定为每秒钟启动一次,但我不被允许篡改。这就是我在被难倒之前所能做到的: main.m:Objective c 当当前分钟的值发生变化时(使用Cocoa),如何显示时间?,objective-c,cocoa,nsdate,nstimer,Objective C,Cocoa,Nsdate,Nstimer,好吧,这件事真让我难堪。这个挑战看起来很简单,但有一些限制,真的让我很反感 节目要点: (1) 当分钟更改时,应用程序应以HH:mm:ss格式输出当前时间 (2) 当第二次更改时,应用程序应每秒钟输出一个字符,每十秒钟输出一个不同的字符(即“…..…..…..…..”)。这里重要的是要注意,我不能只数秒;相反,程序必须知道当前时间的秒的值,并且仅当它可以被10整除时才输出相应的字符 限制: (1) 该程序可以有两个类——一个用于分钟显示,另一个用于第二次显示 (2) 每个类只能包含一个以计时器为
MinuteDisplay *minutes = [[MinuteDisplay alloc] init];
__unused NSTimer *minutesTimer =
[NSTimer scheduledTimerWithTimeInterval:0.5
target:minutes
selector:@selector(minuteChange:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] run];
- (void)minuteChange:(NSTimer *)timer
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss"];
NSDateFormatter *testFormatter = [[NSDateFormatter alloc] init];
[testFormatter setDateFormat:@"ss"];
NSDate *now = [NSDate date];
NSString *nowString = [dateFormatter stringFromDate:now];
NSString *testString = [testFormatter stringFromDate:now];
if ([testString isEqual:@"00"]) {
NSLog(@"%@", nowString];
}
}
分钟显示.m:
MinuteDisplay *minutes = [[MinuteDisplay alloc] init];
__unused NSTimer *minutesTimer =
[NSTimer scheduledTimerWithTimeInterval:0.5
target:minutes
selector:@selector(minuteChange:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] run];
- (void)minuteChange:(NSTimer *)timer
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss"];
NSDateFormatter *testFormatter = [[NSDateFormatter alloc] init];
[testFormatter setDateFormat:@"ss"];
NSDate *now = [NSDate date];
NSString *nowString = [dateFormatter stringFromDate:now];
NSString *testString = [testFormatter stringFromDate:now];
if ([testString isEqual:@"00"]) {
NSLog(@"%@", nowString];
}
}
示例输出:
01:09:00
//.5 second interval
01:09:00
我甚至还没有为下半场的挑战而烦恼,因为我在这里被难倒了。这在技术上是可行的,但我知道我做错了,因为输出并不依赖于程序,因为它知道分钟的值已经改变了。另外,由于计时器设置为每.5秒启动一次,因此我每分钟获得两行输出,而不是一行(这不符合规格)
有人能建议下一步该怎么走吗?这一个确实让我感到困惑。如果不能修改计时器间隔,另一个选择是在MinuteDisplay类中使用实例变量,例如,
displayString
。并修改minuteChange
方法如下:
- (void)minuteChange:(NSTimer *)timer
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss"];
NSDateFormatter *testFormatter = [[NSDateFormatter alloc] init];
[testFormatter setDateFormat:@"ss"];
NSDate *now = [NSDate date];
NSString *nowString = [dateFormatter stringFromDate:now];
NSString *testString = [testFormatter stringFromDate:now];
if ([testString isEqual:@"00"]) {
if(![nowString isEqualToString:dispString]) {
dispString = nowString;
NSLog(@"*************** %@", dispString);
}
}
}
这将确保每分钟只记录一次工作分钟更改方法:
- (void)minuteChange:(NSTimer *)timer
{
NSDate *now = [NSDate date];
if (!self.lastTime) {
self.lastTime = [NSDate date];
}
if (now > self.lastTime) {
if ([[self.seconds stringFromDate:now] isEqualToString:@"00"]) {
printf("\n%s", [[self.output stringFromDate:now] UTF8String]);
self.lastTime = now;
}
}
self.output = [[NSDateFormatter alloc] init];
[self.output setDateFormat:@"HH:mm:ss"];
self.seconds = [[NSDateFormatter alloc] init];
[self.seconds setDateFormat:@"ss"];
}
- (void)secondChange:(NSTimer *)timer
{
long secondsSince1970 = time(NULL);
if (!self.lastSecond) {
self.lastSecond = secondsSince1970;
}
if (secondsSince1970 > self.lastSecond) {
if (secondsSince1970 % 10 == 0) {
printf("|");
self.lastSecond = secondsSince1970;
} else {
printf(".");
self.lastSecond = secondsSince1970;
}
}
}
工作变更方法:
- (void)minuteChange:(NSTimer *)timer
{
NSDate *now = [NSDate date];
if (!self.lastTime) {
self.lastTime = [NSDate date];
}
if (now > self.lastTime) {
if ([[self.seconds stringFromDate:now] isEqualToString:@"00"]) {
printf("\n%s", [[self.output stringFromDate:now] UTF8String]);
self.lastTime = now;
}
}
self.output = [[NSDateFormatter alloc] init];
[self.output setDateFormat:@"HH:mm:ss"];
self.seconds = [[NSDateFormatter alloc] init];
[self.seconds setDateFormat:@"ss"];
}
- (void)secondChange:(NSTimer *)timer
{
long secondsSince1970 = time(NULL);
if (!self.lastSecond) {
self.lastSecond = secondsSince1970;
}
if (secondsSince1970 > self.lastSecond) {
if (secondsSince1970 % 10 == 0) {
printf("|");
self.lastSecond = secondsSince1970;
} else {
printf(".");
self.lastSecond = secondsSince1970;
}
}
}
对minuteChange的更改:
最重要的变化是在课堂上增加了最后一次ivar。现在很简单…如果lastTime为null,则为其指定当前日期的值。如果当前时间大于上次时间,则测试是否为新的分钟,如果为新的分钟,则输出时间。仅在输出新分钟时更新lastTime(这可确保每分钟仅显示一次时间)
第二次更改:
在这个问题上采取了不同的方法,现在我希望我第一次用的是C。这个太简单了!检查当前秒数是否大于最后一秒。如果是,检查它是否可以被10整除。如果是,请打印“|”。如果没有,请打印“”。超级简单,实际上比设置定时器每秒点火更准确。嘘