1

私は今、1日か2日噛んでいる小さな問題に遭遇しました。

DateCellと呼ばれるAppleのサンプルプロジェクトを使用して、そのUIDatePickerを持ち上げ、時刻に設定しました。画面のオン/オフのアニメーションスライドと同じように、この特定のコードを使用しました。

私のワークフローは、開始時間、ランチタイムアウト、ランチタイムイン、および停止時間の4つの値を設定することです。[NSDatedate]を使用してこれらの値を設定しました。

次に、NSCalander:component呼び出しを使用して、「ランチタイムアウトを取得するために開始時間に30分を追加する」、「開始時間-ランチタイムアウト-停止時間を取得するために8時間」などの計算を行います。

初期設定は問題なく進みます。開始時間セルをクリックするとピッカーが表示され、時間の変更を選択すると、私の簡単な数式に従って他の3回が変更されます。

2行目が選択されている場合、ランチタイムアウトになると、ホイールが再び上がり、ランチタイムアウト時間を選択します。しかし、これが私の問題の始まりです。私のUIDatePickerModeTimeホイールは、1970年1月1日の日付部分を返すようです。そして、この日付部分は、私の数式を台無しにします。

私の質問は、これを修正するために何ができるかということです。

ピッカーのXIBで初期の最小時間を設定してみました。この種の動作は機能しますが、ホイールで時間を選択すると、ホイールはXIBで設定された時間に回転します。この方法は、すっきりした感じがしません。

initWithTimeIntervalクラスのメソッドを設定しようとしましたが、これらは時間をブロックし、私が探しているものではないと思います。

NSDateFormatter:stringFromDate | dateFromString呼び出しも試しましたが、これらは影響しませんでした。

私がまだしていないこと:

カスタム定義の日付/時刻文字列。

UIDatePicker:Timeを最初から再構築する

私は何かを見過ぎていますか?

ありがとう。

4

1 に答える 1

1

私は自分の問題を解決しました、そしてこれが私がそれに対処した方法です。

私の答えにたどり着く前に、私はまだ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(時間モードに設定されている)を使用して時間を管理する方法です。

簡単に言うと、ピッカーが回しているものを操作するために間違った方法を使用していたということです。

これがお役に立てば幸いです。また必要になった場合は、ここに表示されることを願っています;)

于 2011-05-24T16:29:49.927 に答える