2011-05-20 74 views
1

我遇到了一個我一直咀嚼了一兩天的小問題。UIDatePicker,time和1970

使用名爲DateCell的Apple示例項目我解除其UIDatePicker並將其設置爲時間。我使用了這個特殊的代碼,因爲它在屏幕上/屏幕上顯示動畫幻燈片。

我的工作流程是設置四個值,開始時間,午餐時間,午餐時間和停止時間。我通過使用[NSDate日期]來設置這些值。

然後我使用NSCalander:組件調用來做一些數學運算,例如「添加30分鐘開始時間以獲得午餐時間」,以及「開始時間 - 午餐超時 - 8小時以獲得停止時間」。

初始設置很好。單擊開始時間單元格會顯示選取器,然後選擇一個時間按照我簡單的數學公式進行三次更改。

如果選擇了第二行,午餐超時,輪子再次出現以選擇午餐時間。然而,這是我的問題開始的地方。看來我的UIDatePickerModeTime輪返回1970年1月1日的日期部分。它的這個日期部分混淆了我的數學公式。

我的問題是,我能做些什麼來解決這個問題?

我已經嘗試在拾取器的XIB中設置初始最小時間。這樣的作品,但是當你在車輪上挑選一段時間時,車輪會旋轉到XIB中設定的時間。這種方法沒有一個乾淨的感覺。

我試過設置initWithTimeInterval類的方法,但是這些阻塞時間並不是我想要的。

我也試過NSDateFormatter:stringFromDate | dateFromString調用,並且這些沒有任何影響。

我還沒有做的事:

自定義定義的日期/時間字符串。從頭

時間上午我在找什麼:

重建的UIDatePicker?

謝謝。

回答

1

我解決了我的問題,這裏是我如何解決它。

在我回答我的問題之前,我對Objective-C和麪向對象編程還是很陌生,所以我的詞彙並不知道如何描述我嘗試解釋的一些東西。所以在閱讀時要考慮到這一點。

在時間模式下使用UIDatePicker,即進入您的NIB/XIB文件並將您的UIDatePicker對象設置爲'time',將只返回時間。這是我出錯的地方。

使用NSDateComponent或任何NSCalendar方法將帶出選擇器的日期組件。因此你會在1970年1月1日的NSLog回報中看到例子。

我不得不尋找一種新的方式來完成我的數學和操縱我從拾取器中獲得的時間。

我最終使用的是NSTimeInterval,dateByAddingTimeInterval和timeIntervalSinceDate。研究表明,NSTimeInterval也是一個浮點型,所以我用float來做一些數學運算。

下面一個例子 -

if (indexPath.row == [labelArray indexOfObjectIdenticalTo:@"Clock Out"]) 
    {   
     NSTimeInterval diffClockInOutToLunch = [outToLunch timeIntervalSinceDate:clockIn]; 
     float remainingInTheDay = 28800 - diffClockInOutToLunch; 

     self.clockOut = [inFromLunch dateByAddingTimeInterval:remainingInTheDay]; 

     cell.detailTextLabel.text = [self.dateFormatter stringFromDate:clockOut]; 

     self.clockOutIndex = indexPath; 

     return cell; 
    } 

我使用一個TableView中顯示我的田地。當這個'if'語句被觸發時,它將填充顯示「Clock Out」的行的detailTextLabel。在視覺上,「Clock Out」這個短語將位於該行的左側,時間將在右側。

diffClockInOutToLunch被定義爲NSTimeInterval類型。正在執行的操作是timeIntervalSinceDate,它實際上是從clockIn的值中減去outToLunch的值。想象一下,在晚上11點和鐘點在上午6點。這個差別是5個小時。 NSTimeInterval僅將值存儲爲秒,因此5小時的差值爲18000秒。

然後,我使用float執行正常的數學運算。在這種情況下,我想知道在工作日中還有多少小時。假定一天工作的時間是8小時。由於NSTimeInterval返回秒數,因此我將8小時轉換爲秒(28,800秒),然後從28800中減去diffClockInOutToLunch。現在remainingInTheDay等於10800或3小時。

我執行的下一個操作是將clockOut設置爲我們工作日完成的時間。爲此,我使用dateByAddingTimeInterval操作,它也是一個NSDate方法,因此無論它返回的是日期/時間格式。在這個操作中,我們在inFromLunch中添加remainingInTheDay(10,800秒)(例如上午11:30)。我們的clockOut時間現在是下午2:30,然後通過我的DateFormatter發送,並作爲字符串返回到TableView的單元格中,並存儲起來供以後使用。

這裏是另外一個例子,從我的代碼進一步下跌 -

- (void)clockInChanged 
{ 
    // Set clockIn value 
    self.clockIn = self.pickerView.date; 

    // Change the outToLunch time 
    self.outToLunch = [self.pickerView.date dateByAddingTimeInterval:5*60*60]; 

    UITableViewCell *outToLunchCell = [self.tableView cellForRowAtIndexPath:outToLunchIndex]; 
    outToLunchCell.detailTextLabel.text = [self.dateFormatter stringFromDate:outToLunch]; 

    // Change the inFromLunch time 
    self.inFromLunch = [outToLunch dateByAddingTimeInterval:30*60]; 

    UITableViewCell *inFromLunchCell = [self.tableView cellForRowAtIndexPath:inFromLunchIndex]; 
    inFromLunchCell.detailTextLabel.text = [self.dateFormatter stringFromDate:inFromLunch]; 

    // Change the clockOut time 
    NSTimeInterval diffClockInOutToLunch = [outToLunch timeIntervalSinceDate:clockIn]; 
    float remainingInTheDay = 28800 - diffClockInOutToLunch; 

    self.clockOut = [inFromLunch dateByAddingTimeInterval:remainingInTheDay]; 
    UITableViewCell *clockOutCell = [self.tableView cellForRowAtIndexPath:clockOutIndex]; 
    clockOutCell.detailTextLabel.text = [self.dateFormatter stringFromDate:clockOut]; 
} 

在這個例子中,我們先前已經決定,關於該行「時鐘在」時選擇(「觸摸的內心,」如果你會),我們下降到這種方法。

這種方法會發生什麼,只要使用選取器更改clockIn,outToLunch,inFromLunch和clockOut中顯示的時間自動更新並顯示。

這個例子顯示我們捕獲picker(self.pickerView.date)的值爲clockIn。然後,我們使用clockIn來播種我們的dateByAddingTimeInterval的混亂等等。

所以。這就是我如何使用UIDatePicker(設置爲時間模式)管理自己的時間。

簡短的回答是我正在使用錯誤的方法來處理我的選擇器正在轉動。

我希望這可以幫助你,並希望它會在這裏,如果我再次需要它;)