天道酬勤,学无止境

Using three arrays to populate complication timeline

I have three arrays that have the data to populate the complication timeline with entries.

When I scroll through time travel, the complication does not change so I know I must be doing something wrong.

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)
}

My thinking:

  • Loop through the three arrays
  • Set the template with the results of the array loops
  • Set the timeline entry with the date of the object in body2Array

The output on my console is:

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

评论

Why time travel isn't working the way you expect:

Time travel only supports a 48-hour sliding window. Any timeline entries outside the complication server's latestTimeTravelDate will be ignored.

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.

You can't time travel over six months ahead to October 1, so your Mar 21 entry would never change to show the October 1 entry.

Other issues:

You probably don't mean to iterate through every body object for each header object.

You also want to start with an empty entries array within this method, so you're not inadvertently appending to an array with any existing (backwards) timeline entries.

Change your loop to look something like this:

// 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)")

This will give you headerArray.count timeline entries, instead of headerArray.count x body1Array.count x body2Array.count entries.

You may also want to specify the type of objects in each array so you don't have to constantly use as!. This will provide type safety and let the compiler type-check your code.

It also might make your code more readable and maintainable if you keep the data in an array of structs (with header, text, and date properties), instead of using multiple arrays.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • What is the flow for updating complication data for Apple Watch?
    I've been following a lot of tutorials on the internet to learn how to set up the complication. I have no problem getting the complication set up as expected. Until the initial timeline entries expire. After 12 hours, I do not know how to update it to keep the complication live. I'll share everything I have below and hopefully somebody can help fill me in. Here, I create the variables for my data that I want to display on the complication. struct data = { var name: String var startString: String var startDate: NSDate } The following array is a container for this data. var dataArray = [data]
  • 更新Apple Watch并发症数据的流程是什么?(What is the flow for updating complication data for Apple Watch?)
    问题 我一直在互联网上关注许多教程,以学习如何设置并发症。 我可以按预期设置并发症。 直到初始时间轴条目到期。 12小时后,我不知道如何对其进行更新以使并发症持续存在。 我将分享我下面的所有内容,希望有人可以帮助我填写。 在这里,我为要在复杂情况下显示的数据创建了变量。 struct data = { var name: String var startString: String var startDate: NSDate } 以下数组是此数据的容器。 var dataArray = [data] 这样可以在手表锁定时显示复杂情况。 func getPrivacyBehaviorForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationPrivacyBehavior) -> Void) { handler(.ShowOnLockScreen) } 这样就可以在复杂情况下进行时间旅行。 func getSupportedTimeTravelDirectionsForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimeTravelDirections) ->
  • ClockKit CLKComplicationDataSource 缺少向后事件(ClockKit CLKComplicationDataSource missing backward events)
    问题 我编写了一个带有并发症支持的测试应用程序 出于某种原因,钟面仅显示 1-2 个向后事件,但我可以在当前日期之前的日志中看到 10-15 个事件。 当我为前向事件返回一个空数组时,我所有的后向事件都开始显示在钟面上。 这是我的功能 func getTimelineEntriesForComplication(complication: CLKComplication, beforeDate date: NSDate, limit: Int, withHandler handler: (([CLKComplicationTimelineEntry]?) -> Void)) { var entries: [CLKComplicationTimelineEntry] = [] let events = self.events.filter { (event: CEEvent) -> Bool in return date.compare(event.startDate) == .OrderedDescending } var lastDate = date.midnightDate for event in events { let entry = CLKComplicationTimelineEntry(date: lastDate, complicationTemplate
  • WatchOS3 Complication that launches App
    I would like to create a complication for watchOS 3 that will simply launch my App. I have used XCode to create the ComplicationController: class ComplicationController: NSObject, CLKComplicationDataSource { // MARK: - Timeline Configuration func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) { handler([.forward, .backward]) } func getTimelineStartDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { handler(nil) } func getTimelineEndDate(for complication
  • 在 AngularJS 中使用循环和 ng-class 创建包装 DIV(Creating wrapper DIV using loops and ng-class in AngularJS)
    问题 我目前正在使用 AngularJS 创建动态时间线。 我的时间线中的数据是从一个 JSON 文件中获取的,我已经能够成功地配置它。 这是我目前在 PLNKR 上的内容:http://plnkr.co/edit/avRkVJNJMs4Ig5mDrwJ8 这是我目前的导航: <nav id="sticky-navigation"> <ul> <li><a href="#decade-1960s">1960</a></li> <li><a href="#decade-1970s">1970</a></li> <li><a href="#decade-1980s">1980</a></li> <li><a href="#decade-1990s">1990</a></li> <li><a href="#decade-2000s">2000</a></li> <li class="active"><a href="#decade-2010s">2010-Now</a></li> </ul> </nav> 我基本上想为“decade-1960s”、“decade-1970s”等的唯一 ID 创建包装器 div,以便用户可以使用导航有效地导航到他们最感兴趣的十年。 日期是从 JSON 文件中解析出来的,所以我想知道还有另一个可以从 JSON 中获取年份,根据特定的年代组织事件
  • watchOS - 复杂功能显示以前的条目(watchOS - Complication shows previous entry)
    问题 我正在创建一个 watchOS 3 复杂功能,用于显示公共交通服务的出发时间。 我用一个数组创建了一个数据模型,该数组包含带有stationName (String) 和departureTime (NSDate) 的Train对象。 我已经实现了 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,则手表上仍显示第一个条目
  • 启动应用程序的 WatchOS3 并发症(WatchOS3 Complication that launches App)
    问题 我想为 watchOS 3 创建一个复杂功能,它只会启动我的应用程序。 我使用 XCode 来创建 ComplicationController: class ComplicationController: NSObject, CLKComplicationDataSource { // MARK: - Timeline Configuration func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) { handler([.forward, .backward]) } func getTimelineStartDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { handler(nil) } func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) {
  • PHP - 通过循环用变量填充数组(PHP - populate an array with variables by loop)
    问题 我想将我的变量(这些变量的值)放入一个数组中。 我有类似的变量名称,所以我尝试找到一个基于循环的解决方案,它提供相同的输出: $str1 = "one"; $str2 = "two"; $str3 = "three"; $arr = array($str1, $str2, $str3); foreach ($arr as $key => $value){ echo "[", $key, "] = ", $value, "<br/>"; } 对于基于循环的解决方案,我尝试过这种方式,但它不允许将值插入数组: $str1 = "one"; $str2 = "two"; $str3 = "three"; function arrayDefine($varName, $max) { for ($i = 1; $i <= $max; ++$i){ echo "$", $varName, $i; if ($i < $max){ echo ", "; } } } $arrItems = arrayDefine(str, 3); $arr = array($arrItems); foreach ($arr as $key => $value){ echo "[", $key, "] = ", $value, "<br/>"; } 第一个代码块的输出是: [0] = one [1] = two
  • 序列化多个模型并在一个 json 响应中发送所有 django rest 框架(Serialize multiple models and send all in one json response django rest framework)
    问题 这个问题被要求扩展和填补这个问题的漏洞:使用 Django REST 框架从多个模型返回结果 我的目标是返回一个 json 对象,我将用它来动态填充 html 代码中各种选择语句中的选项。 所以我想从模型 a 中获取一个属性,从模型 b 中获取另一个属性等等 然后我想要来自属性 a 和 b 和 c 等的所有值 以 JSON 数组的形式存在于一个键中,因此 json = { modelA: {'atter1, atter2, atter3} modelB: {'atter1, atter2, atter3} model..:{you get the point} } 上面引用的帖子中的这一部分是有道理的: class TimelineViewSet(viewsets.ModelViewSet): """ API endpoint that lists all tweet/article objects in rev-chrono. """ queryset = itertools.chain(Tweet.objects.all(), Article.objects.all()) serializer_class = TimelineSerializer 这不是: class TimelineSerializer(serializers.Serializer): pk =
  • 何时何地获取手表并发症数据(Where and When to get data for Watch Complication)
    问题 在处理了几天的复杂性之后,我有信心说出以下有关在规定间隔内发生的更新的更新过程: 系统调用requestedUpdateDidBegin() 在这里,您可以确定数据是否已更改。 如果没有,则您的应用程序无需执行任何操作。 如果您的数据已更改,则需要调用以下任一方法: reloadTimelineForComplication如果需要重置所有数据)。 如果您只需要在复杂时间线的末尾添加新项目,则可以使用extendTimelineForComplication 。 注意:如果您当天花费了太多的并发症时间预算,则系统实际上可能会调用requestedUpdateBudgetExhausted()而不是requestedUpdateDidBegin() 。 这就是这个问题的原因。 如果您调用了reloadTimelineForComplication ,则系统将调用getCurrentTimelineEntryForComplication (以及将来和过去获取数组的变体,具体取决于您的时间旅行设置) 这是一个猜测,因为我尚未对其进行测试,但是我相信,如果您调用了extendTimelineForComplication ,则只会调用getTimelineEntriesForComplication(... afterDate date: NSDate ...) 。 然后
  • Sorting a repeater field from Advanced Custom Fields in PHP and Timber/Twig
    I'm trying to sort the output of a repeater field from the WordPress plugin Advanced Custom Fields (ACF) using the WordPress Timber plugin implementation of Twig 1.34. The basic PHP example to sort from ACF below is from https://www.advancedcustomfields.com/resources/how-to-sorting-a-repeater-field/ and there are no usable answers for my question in the ACF forums. So I'm trying to convert this function from the example to Timber/Twig: // get repeater field data $repeater = get_field('repeater'); // vars $order = array(); // populate order foreach( $repeater as $i => $row ) { $order[ $i ] =
  • ios开发基础:【什么是 Widget?】简单明了(Glanceable)、恰当展示(Relevant)、个性化定制(Personalized),一个随着时间线而更新的 SwiftUI 视图。
    前言 Widget 不是一个小型的 App,它是一种新的桌面内容展现形式,主要是用于弥补主应用程序无法及时展示用户所关心的数据。如下图所示: 一个优秀的 Widget 需要有三个特点:简单明了(Glanceable)、恰当展示(Relevant)、个性化定制(Personalized) Widget 只能用 SwiftUI 来进行开发,确切的说,Widget 的本质是一个随着时间线而更新的 SwiftUI 视图。 I、▐ 简单明了(Glanceable) Widget 不是一个小型的 App,这句话被反复提起。一般用户每天进入主屏幕的次数超过 90 次,但停留的总时长不过几分钟。通常来说用户只会在主屏幕上停留片刻时间,就会跳转到其他地方,所以并不需要任何复杂的交互设计来增强 Widget 的作用,也不需要复杂的样式来丰富 Widget 的内容,简单明了的内容才是 Widget 的关键。 II、▐ 恰当展示(Relevant) 苹果期望 Widget 可以和正在执行或者考虑的事情紧密 来源:https://kunnan.blog.csdn.net/article/details/107930963
  • 调用ExtensionDelegate来创建/刷新用于并发症的数据(Call ExtensionDelegate to create/refresh data for Complication)
    问题 我所有的数据创建都在ExtensionDelegate.swift完成。 问题是我的ComplicationController.swift getCurrentTimelineEntryForComplication函数之前没有调用ExtensionDelegate.swift 。 有任何想法吗? 这是我的代码和详细信息: 因此,我的ComplicationController.swift数组extEvnts为空: func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) { let extEvnts = ExtensionDelegate.evnts } 因为尚未调用我的ExtensionDelegate.swift ,所以将为数组创建数据: class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate { private let session = WCSession.defaultSession() var receivedData = Array
  • Apple Watch 复杂功能未在后台更新(Apple Watch Complication not updating in background)
    问题 我有一个 Apple Watch 并发症,它可以正确初始化并显示我期望的数据。 但是,当我的 getNextRequestedUpdateDateWithHandler 方法中返回的 NSDate 触发刷新时,我的委托中唯一被再次调用的方法是 getNextRequestedUpdateDateWithHandler 方法(我在每个方法上设置断点来确定这一点)。 我本来希望在请求的更新日期发生时调用 requestsUpdateDidBegin,但情况似乎并非如此。 有谁知道是什么原因造成的? 这是我的代码: class ComplicationController: NSObject, CLKComplicationDataSource { /// Provide the time travel directions your complication supports (forward, backward, both, or none). func getSupportedTimeTravelDirectionsForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimeTravelDirections) -> Void) { handler(
  • Apple Watch Complication not updating in background
    I have an Apple Watch complication that initializes correctly and show the data I am expecting. However, when the NSDate returned in my getNextRequestedUpdateDateWithHandler method triggers a refresh, the only method in my delegate that gets called again is the getNextRequestedUpdateDateWithHandler method (I set breakpoints at every method to determine this). I would have expected requestedUpdateDidBegin to get called when the requested update date occurs, but that doesn't seem to be the case. Does anyone know what could be causing this? Here is my code: class ComplicationController: NSObject
  • watchOS - 显示有关并发症的实时出发数据(watchOS - Show realtime departure data on complication)
    问题 我有一个公共交通应用程序,其中包含火车的实时出发数据。 我想添加一个显示下一班火车出发时间的复杂功能。 是否可以显示(或刷新)复杂功能的实时数据? 例如,显示“3 分钟到 X 站”。 根据来自公共交通 API 的信息,数据可能每分钟都在变化。 我应该如何在 watchOS 2 或 watchOS 3 上完成此操作? 我知道 ETA 应用程序以复杂的方式显示旅行时间,但我不确定它们是如何实现的。 回答1 可以实时更新吗? 复杂功能并非旨在显示实时数据。 频繁更新会影响能源效率并影响电池(在手表和手机上)。 为了最大限度地减少功耗,ClockKit 要求您提供尽可能多的可用数据,然后缓存数据并在需要时呈现它。 虽然没有固定次数的复杂时间线可以重新加载,但复杂数据源受每日执行时间预算的约束。 如果您的应用程序的数据频繁更改,则可能难以提供足够的数据以在复杂情况下显示。 更糟糕的是,如果您过于频繁地刷新复杂功能数据,您可能会超出执行时间预算,并且您的复杂功能可能要到第二天才会更新。 一旦每日预算用完,对 reloadTimeline(和 extendTimeline)的调用就什么都不做。 如果您的复杂功能已超过其分配的每日执行时间预算,则调用此方法将无济于事。 谨慎调用此方法。 复杂功能如何显示相对时间? 您可以使用 CLKRelativeDateTextProvider
  • 结合 WatchConnectivity 和复杂功能(Combining WatchConnectivity and Complications)
    问题 我希望我的复杂功能通过 Watch Connectivity 从 iPhone 获取数据。 我正在使用sendMessage即时消息技术。 当我尝试获取数据时,我不希望我的 iPhone 应用程序打开,因此这需要在后台运行。 在我的 iPhone 上的 ViewController 中: import UIKit import WatchConnectivity class ViewController: UIViewController, WCSessionDelegate { var session: WCSession! override func viewDidLoad() { super.viewDidLoad() if WCSession.isSupported() { self.session = WCSession.defaultSession() self.session.delegate = self self.session.activateSession() } } func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { if message
  • 显示 2 行相同名称的 Google 时间线图表(Google Timeline chart to display 2 rows of same names)
    问题 我想用重复的行名称显示 2 行,我正在关注这个讨论线程: 谷歌时间线重叠时间表 但我希望“乔治华盛顿”显示在 2 行中,而不是在同一行中。 var data=[ ['George Washington', new Date(1779, 3, 29), new Date(1790, 2, 3)], ['George Washington', new Date(1789, 3, 29), new Date(1797, 2, 3)], ['John Adams', new Date(1797, 2, 3), new Date(1801, 2, 3)], ['Thomas Jefferson', new Date(1801, 2, 3), new Date(1809, 2, 3)], ]; 显示在:http://jsfiddle.net/9GbNP/33/ 中的解决方案并不是我想要的,因为它将“乔治华盛顿”视为 1 个条目。 就我而言,它是 2 个条目。 在看到适用于上述案例的“WhiteHat”答案后,我意识到我的案例更加复杂。 更多说明: var data=[ [1, 'George Washington', new Date(1779, 3, 29), new Date(1790, 2, 3)], [2, 'George Washington', new Date(1789
  • 使用 Firebase Data Swift、Xcode 7 填充 UITableViewController(Populating UITableViewController With Firebase Data Swift, Xcode 7)
    问题 我正在Xcode 7使用swift 。 我对Swift, Xcode, and Firebase完全Swift, Xcode, and Firebase 。 我想在我的 iOS 应用程序中有三个UITableViewController 。 前两个TableView controllers需要动态内容,第三个 TableView 控制器需要静态内容。 我希望第二个和第三个 TableView 控制器根据在前一个 TableView 控制器上按下的内容来显示数据。 所有数据都将来自我的 Firebase。 我不知道从哪里开始。 请指出我正确的方向! 谢谢! 回答1 这个问题很广泛,因为它询问如何完成三个不同的任务。 如果你一次只要求一件事,我认为你最好得到答案。 我可以帮助您使用 Firebase 填充UITableViewController 。 class MyTableViewController: UITableViewController { // your firebase reference as a property var ref: Firebase! // your data source, you can replace this with your own model if you wish var items = [FDataSnapshot]()
  • 如何从外部文件 JSON 创建 JAVASCRIPT ARRAY(How to create JAVASCRIPT ARRAY from external file JSON)
    问题 从 json 文件创建 javascript 数组的最佳方法是什么? 我有四个空的 JavaScript 数组,我想用从 json 文件导入的数据填充它们。 var firstname = new Array(); var address= new Array(); var city = new Array(); 文件 Json:“file.json” [ {"name ": "John", "address": "350 Fifth Avenue", "city ": "New York"}, {"name ": "Mark", "address": "1101 Arch St", "city ": "Philadelphia"}, {"name ": "Jack", "address": "60th Street", "city ": "Chicago"} ] 我尝试: $.getJSON('file.json',function (data) { for (var i = 0; i < data.length; i++) { firstname.push.apply( firstname, data[i].firstname ); address.push.apply( address, data[i].address ); city.push.apply( city