Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 当当前分钟的值发生变化时(使用Cocoa),如何显示时间?_Objective C_Cocoa_Nsdate_Nstimer - Fatal编程技术网

Objective c 当当前分钟的值发生变化时(使用Cocoa),如何显示时间?

Objective c 当当前分钟的值发生变化时(使用Cocoa),如何显示时间?,objective-c,cocoa,nsdate,nstimer,Objective C,Cocoa,Nsdate,Nstimer,好吧,这件事真让我难堪。这个挑战看起来很简单,但有一些限制,真的让我很反感 节目要点: (1) 当分钟更改时,应用程序应以HH:mm:ss格式输出当前时间 (2) 当第二次更改时,应用程序应每秒钟输出一个字符,每十秒钟输出一个不同的字符(即“…..…..…..…..”)。这里重要的是要注意,我不能只数秒;相反,程序必须知道当前时间的秒的值,并且仅当它可以被10整除时才输出相应的字符 限制: (1) 该程序可以有两个类——一个用于分钟显示,另一个用于第二次显示 (2) 每个类只能包含一个以计时器为

好吧,这件事真让我难堪。这个挑战看起来很简单,但有一些限制,真的让我很反感

节目要点:

(1) 当分钟更改时,应用程序应以HH:mm:ss格式输出当前时间

(2) 当第二次更改时,应用程序应每秒钟输出一个字符,每十秒钟输出一个不同的字符(即“…..…..…..…..”)。这里重要的是要注意,我不能只数秒;相反,程序必须知道当前时间的秒的值,并且仅当它可以被10整除时才输出相应的字符

限制:

(1) 该程序可以有两个类——一个用于分钟显示,另一个用于第二次显示

(2) 每个类只能包含一个以计时器为参数的void方法

(3) main函数将为每个类创建一个对象和2个NSTimer第一个计时器的间隔必须设置为0.5,并且必须以分钟对象为目标。第二个计时器的间隔必须设置为0.1,并且必须以秒对象为目标。

我很想把第一个时间设定为每分钟启动一次,第二个计时器设定为每秒钟启动一次,但我不被允许篡改。这就是我在被难倒之前所能做到的:

main.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];
    }
}
分钟显示.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整除。如果是,请打印“|”。如果没有,请打印“”。超级简单,实际上比设置定时器每秒点火更准确。嘘