私は自分の問題を解決しました、そしてこれが私がそれに対処した方法です。
私の答えにたどり着く前に、私はまだObjective-Cとオブジェクト指向プログラミングに本当に慣れていないので、私の語彙は私が説明しようとしたことのいくつかを説明する方法を知りません。したがって、これを読むときはこれを考慮に入れてください。
時間モードでUIDatePickerを使用する、つまり、NIB / XIBファイルに移動し、UIDatePickerオブジェクトを「time」に設定すると、時間のみが返されます。これは私が間違っていたところです。
NSDateComponentまたはNSCalendarメソッドのいずれかを使用すると、ピッカーの日付コンポーネントが表示されます。したがって、たとえばNSLogのリターンには1970年1月1日が表示されます。
ピッカーから取得した時間の計算と操作を行う新しい方法を見つけなければなりませんでした。
最終的に使用したのは、NSTimeInterval、dateByAddingTimeInterval、およびtimeIntervalSinceDateです。調査によると、NSTimeIntervalもfloatタイプであることがわかったので、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」ステートメントが作動すると、「ClockOut」を表示している行のdetailTextLabelにデータが入力されます。視覚的には「ClockOut」というフレーズが列の左側にあり、時間は右側にあります。
diffClockInOutToLunchは、NSTimeIntervalタイプとして定義されています。実行される操作はtimeIntervalSinceDateであり、これは基本的にclockInの値からoutToLunchの値を減算します。outToLunchが11:00pmで、clockInが6:00amであると想像してください。この差は5時間です。NSTimeIntervalは値を秒としてのみ格納するため、この5時間の差は18000秒です。
次に、floatを使用して通常の数学演算を実行します。この場合、1日の残り時間が何時間かを調べたいと思います。これは、1日の労働時間が8時間であることを前提としています。NSTimeIntervalは秒を返すため、8時間を秒(28,800秒)に変換してから、28800からdiffClockInOutToLunchを減算します。remainingInTheDayは10800、つまり3時間になります。
次に実行する操作は、clockOutを作業日の終了時刻に設定することです。これを行うには、NSDateメソッドでもあるdateByAddingTimeInterval操作を使用するため、返されるものはすべて日付/時刻形式になります。この操作では、remainingInTheDay(10,800秒)をinFromLunch(たとえば、午前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に表示される時刻が自動的に更新されて表示されることです。
この例は、ピッカー(self.pickerView.date)の値をclockInとしてキャプチャすることを示しています。次に、clockInを使用して、dateByAddingTimeIntervalなどの混乱をシードします。
それで。これは、UIDatePicker(時間モードに設定されている)を使用して時間を管理する方法です。
簡単に言うと、ピッカーが回しているものを操作するために間違った方法を使用していたということです。
これがお役に立てば幸いです。また必要になった場合は、ここに表示されることを願っています;)