1

我正在创建一个 watchOS 3 复杂功能,显示公共交通服务的出发时间。我创建了一个带有数组的数据模型,该数组包含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
    }
}
4

1 回答 1

1

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

  • 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会话中进行了说明。在指定事件的时间线日期方面,演示者提到如何

我们应该将模板放在上一个活动的末尾,以便您有足够的时间参加下一个活动。

现在,Paul 在日历并发症的上下文中提到的天真的解决方案是使用比赛开始日期作为我们的时间线条目的日期,但这会有它对日历也有的缺点,那就是你不会'无法查看您的并发症以了解即将开始的游戏。

您将只能看到已经开始的游戏。

所以我们实际上想要做与保罗对日历所做的相同的事情,并将所有这些条目向前移动。

我们将让每个条目在上一场比赛结束时开始。

在您的情况下,每个条目都将在上一列火车出发的时间之后立即开始。

如何实现您的并发症:

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

  • 指定您支持向前时间旅行。

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

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

于 2016-06-20T19:28:39.057 回答