0

ここに問題がありNSStringます。ビューがロードされたときに int 値を持つ 3 つの 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代わりに format を使用できるのに、先頭の「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

これらの整数を静的にしたい理由はわかりませんが、実行時に(動的に)初期化できる静的(グローバル)データを作成できるトリックを次に示します。それを管理するクラス メソッドを作成するだけです。

@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 に答える
0

それらを上記のView Controllerのインスタンス変数に移動し、初期化時にそれらの値を設定/計算するだけです。終わり。

于 2012-09-02T01:06:09.353 に答える