0

好的,问题来了,我有三个NSString带有 int 值的 s,当视图加载时需要运行:

NSCalendar* gregorian = [[NSCalendar alloc]
      initWithCalendarIdentifier:NSGregorianCalendar];

unsigned int uintFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents* differenceComponents = [gregorian components:uintFlags
                    fromDate:quitDate toDate:nowDate options:0];

NSString *hours1 = [NSString stringWithFormat:@"%d",[differenceComponents hour]];
hours = hours1;

NSString *minutes1 = [NSString stringWithFormat:@"%d",[differenceComponents minute]];
minutes = minutes1;

NSString *seconds1 = [NSString stringWithFormat:@"%d",[differenceComponents second]];
seconds = seconds1;

那些NSString现在有 int 值,所以我不能将 int 设置为 static 任何建议?我想这样做,所以我不会...

- (void)updater:(id)sender {
    [NSTimer scheduledTimerWithTimeInterval:1.0f target:self
        selector:@selector(timer:) userInfo:nil repeats:YES];
}
- (void)timer:(id)sender {
    // I get error right here that says (initialize 
    // element is not a compile-contstant)
    static int hour = hours.intValue;
    static int minute = minutes.intValue;
    static int second = seconds.intValue;

    NSString *sec = [NSString stringWithFormat:@"%i",second];
    if (seconds1 < 10) {
        sec = [NSString stringWithFormat:@"0%i",second];
    }
    NSString *min = [NSString stringWithFormat:@"%i",minute];
    if (minutes1 < 10) {
        min = [NSString stringWithFormat:@"0%i",minute];
    }
    NSString *hours5 = [NSString stringWithFormat:@"%i",hour];
    NSString *timerTime = [NSString stringWithFormat:@"%@:%@:%@" ,hours5 ,min ,sec];
    label1.text = timerTime;
    seconds1 ++;
    if (seconds1 > 59) {
        seconds1 = 00;
        minutes1 ++;
    }
    if (minutes1 > 59) {
        minutes1 = 00;
        hours1 ++;
    }
}
4

4 回答 4

2

为什么要使用static?我不明白制作这些变量的意义static。为什么还要使用NSString来封装你的int价值观?!???为什么不直接存储 int 值?

实际上,您不应该在每次执行该方法时自己添加秒数timer,因为NSTimer可能会漂移,所以在一段时间后(相当长的时间,当然,但仍然如此),您可以让这种漂移影响“秒”部分。最好每次重新计算 timeInterval。%02i当您可以使用格式时,为什么还要自己添加前导“0” ?

实际上,您的代码可以像这样简单明了:

-(void)timer:(NSTimer*)sender
{
    NSTimeInterval elapsedTime = -[quitDate timeIntervalSinceNow];
    label1.text = [NSString stringWithFormat:@"%02i:%02i:%02i",
                    (int)elapsedTime/3600,
                   ((int)elapsedTime/60  ) % 60,
                   ((int)elapsedTime     ) % 60];
}
于 2012-09-02T01:28:37.697 回答
0

static变量不能是“动态的”。编译器应该知道在程序运行之前分配的值是什么。

于 2012-09-02T00:04:14.930 回答
0

只需将它们移动到所述视图控制器的实例变量,并在初始化时设置/计算它们的值。完毕。

于 2012-09-02T01:06:09.353 回答
0

您希望这些整数是静态的原因让我难以理解,仍然有一个技巧可以让您拥有可以在运行时(动态)初始化的静态(全局)数据。只需创建一个管理它的类方法:

@interface MyClasss : NSObject

+ (NSDateComponents *)dateComponents;
+ (NSInteger)hours;
+ (NSInteger)minutes;
+ (NSInteger)seconds;

@end

@implementation MyClass

+ (NSDateComponents *)dateComponents
{
    NSCalendar* gregorian = [[NSCalendar alloc]
    initWithCalendarIdentifier:NSGregorianCalendar];

    unsigned int uintFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit |     NSSecondCalendarUnit;
    NSDateComponents* differenceComponents = [gregorian components:uintFlags
                    fromDate:quitDate toDate:nowDate options:0];
}

+ (NSInteger)hours
{
    NSString *hoursText = [NSString stringWithFormat:@"%d",[self dateComponents hour]];
    return hoursText.integerValue;
}

+ (NSInteger)minutes
{
    NSString *minutesText = [NSString stringWithFormat:@"%d",[self dateComponents minute]];
    return minutesText.integerValue;
}

+ (NSInteger)seconds
{
    NSString *secondsText = [NSString stringWithFormat:@"%d",[self dateComponents second]];
    return secondsText.integerValue;
}

@end

现在您可以随意使用静态数据,无需实例化对象即可访问:

NSInteger hours = [MyClass hours];
于 2012-09-02T02:12:48.610 回答