0

UIDatePicker入力と実世界の時間との時差を のIBOutletラベルに表示しようとしていますdd:hh:mm:ss。正しい情報をNSLog表示していますが、同じデータをラベルに表示するのに苦労しています。現在のところ、UILabel には何も表示されませんが、正しいデータは NSLog にあります。私が変わるとき

[self.formatter stringFromDate:timeDif];

[self.formatter stringFromDate:selected];

現在の DatePicker 選択時刻が表示されます (これは私が望むものではありません) が、NSLog には時差が正しく表示されます。書式設定シーケンスまたは何かに問題があることはわかっていますが、どこが間違っているのかわかりません。

- (IBAction)displayDate:(id)sender {

    NSDate *timeDif = [self.formatter dateFromString:self.string];
    NSDate *todaysDate = [NSDate date];
    NSDate *selected = [picker date];

    self.formatter = [NSDateFormatter new];
    [self.formatter setDateFormat:@"dd:hh:mm:ss"];

    [picker setDate:selected animated:YES];

    self.label.text = [self.formatter stringFromDate:timeDif];

    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];

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

    NSUInteger unitFlags = NSDayCalendarUnit | NSMinuteCalendarUnit | NSHourCalendarUnit | NSSecondCalendarUnit;

    NSDateComponents *dateComparisonComponents = [gregorian components:unitFlags
                                                              fromDate:todaysDate
                                                                toDate:selected
                                                               options:NSWrapCalendarComponents];

    NSInteger days = [dateComparisonComponents day];
    NSInteger hours = [dateComparisonComponents hour];
    NSInteger minutes = [dateComparisonComponents minute];
    NSInteger seconds = [dateComparisonComponents second];

    dateComponents.day = days;
    dateComponents.hour = hours;
    dateComponents.minute = minutes;
    dateComponents.second = seconds;

    self.string = [NSString stringWithFormat:@"%1d:%1d:%1d:%1d",
                                              dateComparisonComponents.day,
                                              dateComparisonComponents.hour,
                                              dateComparisonComponents.minute,
                                              dateComparisonComponents.second];

     NSLog(@"%1d:%1d:%1d:%1d",
                             dateComparisonComponents.day,
                             dateComparisonComponents.hour,
                             dateComparisonComponents.minute,
                             dateComparisonComponents.second);
}
4

1 に答える 1

1

余分で不要なコードが非常に多くあります。これを行うだけです:

- (IBAction)displayDate:(id)sender {
    NSDate *todaysDate = [NSDate date];
    NSDate *selected = [picker date];

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

    NSUInteger unitFlags = NSDayCalendarUnit |NSMinuteCalendarUnit | NSHourCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents *dateComparisonComponents = [gregorian components:unitFlags
                                                              fromDate:todaysDate
                                                                toDate:selected
                                                               options:NSWrapCalendarComponents];

    NSInteger days = [dateComparisonComponents day];
    NSInteger hours = [dateComparisonComponents hour];
    NSInteger minutes = [dateComparisonComponents minute];
    NSInteger seconds = [dateComparisonComponents second];

    self.label.text = [NSString stringWithFormat:@"%ld:%02ld:%02ld:%02ld",
                                              days,
                                              hours,
                                              minutes,
                                              seconds];
}

元のコードでself.formatterは、コードが最初に実行されたときにも設定されません。つまり、初めてtimeDifになります。nilまた、ピッカーの日付を取得し、ピッカーの日付を同じ値に設定します。その理由はありません。そして、あなたdateComponentsは知られていない理由で利用します。そして最後に、何self.stringのために?

于 2013-09-01T06:39:01.187 に答える