1

公共交通機関の出発時刻を表示する watchOS 3 のコンプリケーションを作成しています。(String) と(NSDate)Trainを持つオブジェクトを含む配列を持つデータ モデルを作成しました。stationNamedepartureTime

getCurrentTimelineEntry() メソッドを実装しましたが、エントリがウォッチに表示されています。問題は、時計が前のエントリしか表示しないことです。たとえば、次の出発時刻があります。

 Train(startStation: "Station name", endStation: "Station name", departureTime: stringToDate(dateString: "2016-06-20 14:00")),
 Train(startStation: "Station name", endStation: "Station name", departureTime: stringToDate(dateString: "2016-06-20 14:30")),
 Train(startStation: "Station name", endStation: "Station name", departureTime: stringToDate(dateString: "2016-06-20 14:45")),

現在の時刻が 14:10 の場合、最初のエントリ (時刻は 14:00) がまだ時計に表示されています。現在時刻が 14:30 になるまで、そのエントリが表示されています。現在の時刻が 14:10 の場合、時計で 14:30 の出発時刻を確認したいと思います。

誰かがこれを手伝ったり、正しい方向に向けたりできますか?

func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) {
    if let train = dataProvider.getTrains().nextTrain() {
        handler(timelineEntryForTrain(train: train))
    } else {
        handler(nil)
    }
}


extension Array where Element : OnRailable {
    func nextTrain() -> Element?{
        let now = NSDate()
        for d in self {
            if now.compare(d.departureTime) == .orderedAscending{
                return d
            }
        }

        return nil
    }
}
4

1 に答える 1

1

各エントリのタイムラインの日付を、前回の出発日の 1 分後に設定する必要があります。例えば:

  • 14:30 出発のタイムライン日付は 14:01 である必要があります。
  • 14:45 出発のタイムライン日付は 14:31 である必要があります。

これにより、前の出発から 1 分後に次の出発を現在のタイムライン エントリにすることで、必要な効果が得られます。

  • 14:00になると、現在の14:00発が表示され、
  • 14:01~14:30の間はいつでも、14:30発の出発が表示されます。
  • 14:31 から 14:45 の間の任意の時間に、14:45 の出発が表示されます。

このアプローチは、WWDC 2015 のCreating Complications with ClockKitセッションで説明されています。イベントのタイムラインの日付を指定するという点で、プレゼンターはどのように言及していますか

前のイベントの最後にテンプレートを配置して、次のイベントに行くための十分な時間を確保する必要があります.

さて、カレンダーの複雑さの文脈でポールが言及した単純な解決策は、試合開始日をタイムラインエントリの日付として使用することですが、それにはカレンダーにもあるという欠点があります。コンプリケーションを見て、これから始まるゲームを確認することはできません。

どのゲームがすでに開始されているかしか確認できません。

したがって、実際には、ポールがカレンダーで行ったのと同じことを行い、これらすべてのエントリをさらに進めたいと考えています。

前の試合が終了した時点で各エントリーを開始します。

あなたの場合、各エントリは、前の列車が出発した直後に開始されます。

コンプリケーションの実装方法:

  • タイムラインの終了日を、その日の最終列車が出発してから 1 分後に指定します。これにより、現在の時間が出発時刻を過ぎると、最終列車の出発の詳細がグレー表示されます。

  • フォワード タイム トラベルをサポートすることを指定します。

  • での今後の出発について、将来のタイムライン エントリを提供しgetTimelineEntriesForComplication(_:afterDate:limit:withHandler:)ます。エントリのタイムライン日付を決定するには、エントリのpreviousTrain()方法の出発の詳細を使用します。

リアルタイムの出発スケジュールが変更された場合 (遅延などにより)、タイムラインをリロードして、今後の出発時刻を変更できます。

于 2016-06-20T19:28:39.057 に答える