watchOS - 并发症显示以前的条目

watchOS - Complication shows previous entry

我正在创建 watchOS 3 复杂功能,显示 public 公交服务的出发时间。我创建了一个包含 Train 个对象的数组的数据模型,对象带有 stationName(字符串)和 departureTime(NSDate)。

我已经实现了 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
    }
}

您需要将每个条目的时间线日期设置为在上一个出发日期之后一分钟。例如:

  • 14:30 出发的时间表日期应该是 14:01,
  • 14:45出发的时间表日期应该是14:31,依此类推。

这将产生您想要的效果,方法是将即将到来的出发时间设为当前时间线条目,比上次出发时间晚一分钟:

  • 当14:00时,会显示14:00的当前出发时间,
  • 在 14:01 和 14:30 之间的任何时间,将显示在 14:30 出发的出发时间,
  • 在 14:31 和 14:45 之间的任何时间,将显示在 14:45 出发的出发时间,依此类推。

WWDC 2015 Creating Complications with ClockKit session 中解释了这种方法。在指定事件的时间表日期方面,演示者提到如何

We should put the templates at the end of the previous event so you have adequate time to get to your next event.

Now, the naive solution which Paul mentioned in the context of a calendar complication would be to use the match start date to be the date of our timeline entry, but that would have the drawback that it has for the calendar as well which is you wouldn't be able to look at your complication to see what game is about to start.

You would only be able to see what game has already started.

So we actually want to do the same thing Paul did with the calendar and move all of these entries farther forward.

We will have each entry start at the time when the previous match ended.

在您的情况下,每个条目都将在前一列火车离开的时间之后开始。

如何实现您的复杂功能:

  • 将时间线结束日期指定为当天最后一班火车出发后一分钟。一旦当前时间超过其出发时间,这将使最后一列火车的出发详细信息变灰。

  • 说明您支持前向时间旅行。

  • 为即将在 getTimelineEntriesForComplication(_:afterDate:limit:withHandler:) 出发的航班提供未来时间表条目。要确定条目的时间表日期,请使用条目的 previousTrain() 方法的出发详细信息。

如果您的实时出发时间表发生变化(例如,由于某些延误),您可以重新加载时间线以更改任何即将到来的出发时间。