watchOS - 复杂功能显示上一个条目

时间:2016-06-20 19:01:37

标签: swift watchkit apple-watch-complication clockkit watch-os-3

我正在创建一个watchOS 3复杂功能,显示公共交通服务的出发时间。我创建了一个数组模型,其数组包含Train(String)和stationName(NSDate)的departureTime个对象。

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

1 个答案:

答案 0 :(得分: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()方法的离开详细信息。

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