2013-09-01 28 views
0

我試圖顯示UIDatePicker輸入和真實世界時間的IBOutlet標籤dd:hh:mm:ss形式的時差。我有我的NSLog顯示正確的信息,但我很難得到相同的數據顯示在我的標籤。 截至目前,我的UILabel中沒有顯示任何內容,但正確的數據在NSLog中。 當我改變stringWithFormat,dateFromString,&stringFromDate不工作

[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); 
} 

回答

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

+0

神聖的廢話!這使得更有意義!我非常新,非常自學,因此向我展示了真正幫助我分析代碼並瞭解如何簡化其中所有組件和函數的工作以獲得相同結果。 –

+0

順便說一句 - 我只是做了一個小小的更新。看看新的字符串格式。這會給你小時,分鐘和秒,所以它們總是2位數字,如果需要的話前導零。 – rmaddy

+0

我確實需要這些,謝謝!但是當我更新我的代碼時,我得到了10個前導零。 –