使用三个数组填充并发症时间轴
Using three arrays to populate complication timeline
我有三个数组,其中包含用条目填充并发症时间线的数据。
当我滚动时间旅行时,并发症并没有改变,所以我知道我一定是做错了什么。
func getTimelineEntriesForComplication(complication: CLKComplication, afterDate date: NSDate, limit: Int, withHandler handler: (([CLKComplicationTimelineEntry]?) -> Void)) {
for headerObject in headerArray! {
for body1Object in body1Array! {
for body2Object in body2Array! {
let headerTextProvider = CLKSimpleTextProvider(text: headerObject as! String)
let body1TextProvider = CLKSimpleTextProvider(text: body1Object as! String)
let body2TextProvider = CLKRelativeDateTextProvider(date: body2Object as! NSDate, style: .Offset, units: .Day)
print("HeaderTextProvider: \(headerTextProvider)")
print("Body1TextProvider: \(body1TextProvider)")
print("Body2TextProvider: \(body2TextProvider)")
let template = CLKComplicationTemplateModularLargeStandardBody()
template.headerTextProvider = headerTextProvider
template.body1TextProvider = body1TextProvider
template.body2TextProvider = body2TextProvider
let timelineEntry = CLKComplicationTimelineEntry(date: body2Object as! NSDate, complicationTemplate: template)
entries.append(timelineEntry)
print("TimeEnt: \(entries)")
print("TimeEntCount: \(entries.count)")
}
}
}
handler(entries)
}
我的想法:
- 遍历三个数组
- 使用数组循环的结果设置模板
- 在
body2Array
中设置带有对象日期的时间线条目
我的控制台上的输出是:
HeaderTextProvider: <CLKSimpleTextProvider: 0x78e3f800>
Body1TextProvider: <CLKSimpleTextProvider: 0x78e4eb30>
Body2TextProvider: <CLKRelativeDateTextProvider: 0x78e4f050>
TimeEnt: [<CLKComplicationTimelineEntry: 0x78e4edd0> date = 2016-03-21 05:00:00 +0000, template = <CLKComplicationTemplateModularLargeStandardBody: 0x78e4edf0>, animationGroup = (null), <CLKComplicationTimelineEntry: 0x78e4f520> date = 2016-10-01 17:00:00 +0000, template = <CLKComplicationTemplateModularLargeStandardBody: 0x78e4f540>, animationGroup = (null)]
TimeEntCount: 2
为什么时间旅行没有按照您预期的方式进行:
时间旅行只支持48小时滑动window。 the complication server's latestTimeTravelDate
之外的任何时间线条目都将被忽略。
When constructing your timeline, do not create any entries after this date. Doing so is a waste of time because those entries will not be displayed right away.
您不能将时间旅行提前六个月到 10 月 1 日,因此您 3 月 21 日的条目永远不会更改为显示 10 月 1 日的条目。
其他问题:
您可能并不打算针对每个 header object.
遍历每个 body object
您还希望在此方法中以空 entries
数组开始,这样您就不会无意中将任何现有(向后)时间线条目附加到数组。
将循环更改为如下所示:
// Unwrap optional arrays. You can also check counts if there's the possibility that they are not equally sized.
guard let headers = headerArray, texts = body1Array, dates = body2Array else { return handler(nil) }
var entries = [CLKComplicationTimelineEntry]()
for (index, header) in headers.enumerate() {
let text = texts[index]
let date = dates[index]
...
}
print("TimeEntCount: \(entries.count)")
这将为您提供 headerArray.count
个时间线条目,而不是 headerArray.count
x body1Array.count
x body2Array.count
个条目。
您可能还想在每个数组中指定 object 的类型,这样您就不必经常使用 as!。这将提供类型安全并让编译器 type-check 您的代码。
如果将数据保存在结构数组(具有 header、文本和日期属性)而不是使用多个数组中,也可能使您的代码更具可读性和可维护性。
我有三个数组,其中包含用条目填充并发症时间线的数据。
当我滚动时间旅行时,并发症并没有改变,所以我知道我一定是做错了什么。
func getTimelineEntriesForComplication(complication: CLKComplication, afterDate date: NSDate, limit: Int, withHandler handler: (([CLKComplicationTimelineEntry]?) -> Void)) {
for headerObject in headerArray! {
for body1Object in body1Array! {
for body2Object in body2Array! {
let headerTextProvider = CLKSimpleTextProvider(text: headerObject as! String)
let body1TextProvider = CLKSimpleTextProvider(text: body1Object as! String)
let body2TextProvider = CLKRelativeDateTextProvider(date: body2Object as! NSDate, style: .Offset, units: .Day)
print("HeaderTextProvider: \(headerTextProvider)")
print("Body1TextProvider: \(body1TextProvider)")
print("Body2TextProvider: \(body2TextProvider)")
let template = CLKComplicationTemplateModularLargeStandardBody()
template.headerTextProvider = headerTextProvider
template.body1TextProvider = body1TextProvider
template.body2TextProvider = body2TextProvider
let timelineEntry = CLKComplicationTimelineEntry(date: body2Object as! NSDate, complicationTemplate: template)
entries.append(timelineEntry)
print("TimeEnt: \(entries)")
print("TimeEntCount: \(entries.count)")
}
}
}
handler(entries)
}
我的想法:
- 遍历三个数组
- 使用数组循环的结果设置模板
- 在
body2Array
中设置带有对象日期的时间线条目
我的控制台上的输出是:
HeaderTextProvider: <CLKSimpleTextProvider: 0x78e3f800>
Body1TextProvider: <CLKSimpleTextProvider: 0x78e4eb30>
Body2TextProvider: <CLKRelativeDateTextProvider: 0x78e4f050>
TimeEnt: [<CLKComplicationTimelineEntry: 0x78e4edd0> date = 2016-03-21 05:00:00 +0000, template = <CLKComplicationTemplateModularLargeStandardBody: 0x78e4edf0>, animationGroup = (null), <CLKComplicationTimelineEntry: 0x78e4f520> date = 2016-10-01 17:00:00 +0000, template = <CLKComplicationTemplateModularLargeStandardBody: 0x78e4f540>, animationGroup = (null)]
TimeEntCount: 2
为什么时间旅行没有按照您预期的方式进行:
时间旅行只支持48小时滑动window。 the complication server's latestTimeTravelDate
之外的任何时间线条目都将被忽略。
When constructing your timeline, do not create any entries after this date. Doing so is a waste of time because those entries will not be displayed right away.
您不能将时间旅行提前六个月到 10 月 1 日,因此您 3 月 21 日的条目永远不会更改为显示 10 月 1 日的条目。
其他问题:
您可能并不打算针对每个 header object.
遍历每个 body object您还希望在此方法中以空 entries
数组开始,这样您就不会无意中将任何现有(向后)时间线条目附加到数组。
将循环更改为如下所示:
// Unwrap optional arrays. You can also check counts if there's the possibility that they are not equally sized.
guard let headers = headerArray, texts = body1Array, dates = body2Array else { return handler(nil) }
var entries = [CLKComplicationTimelineEntry]()
for (index, header) in headers.enumerate() {
let text = texts[index]
let date = dates[index]
...
}
print("TimeEntCount: \(entries.count)")
这将为您提供 headerArray.count
个时间线条目,而不是 headerArray.count
x body1Array.count
x body2Array.count
个条目。
您可能还想在每个数组中指定 object 的类型,这样您就不必经常使用 as!。这将提供类型安全并让编译器 type-check 您的代码。
如果将数据保存在结构数组(具有 header、文本和日期属性)而不是使用多个数组中,也可能使您的代码更具可读性和可维护性。