0

複雑なタイムラインにエントリを入力するためのデータを持つ 3 つの配列があります。

タイムトラベルをスクロールしても複雑さが変わらないので、何か間違ったことをしているに違いないことがわかります.

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

私の考え:

  • 3 つの配列をループする
  • 配列ループの結果でテンプレートを設定します
  • オブジェクトの日付でタイムライン エントリを設定します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
4

1 に答える 1

1

タイムトラベルが期待どおりに機能しない理由:

タイム トラベルは、48 時間のスライディング ウィンドウのみをサポートします。コンプリケーションサーバー 以外のタイムライン エントリlatestTimeTravelDateは無視されます。

タイムラインを作成するときは、この日付以降にエントリを作成しないでください。これらのエントリはすぐには表示されないため、これは時間の無駄です。

10 月 1 日より 6 か月以上先にタイムトラベルすることはできないため、3 月 21 日のエントリが 10 月 1 日のエントリを表示するように変更されることはありません。

その他の問題:

おそらく、ヘッダー オブジェクトごとにすべての body オブジェクトを反復処理するつもりはありません。

また、このメソッド内で空の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)")

これにより、 x xエントリheaderArray.countではなく、タイムライン エントリが得られます。headerArray.countbody1Array.countbody2Array.count

また、常に as! を使用する必要がないように、各配列でオブジェクトの型を指定することもできます。これにより、型の安全性が確保され、コンパイラがコードの型をチェックできるようになります。

また、複数の配列を使用するのではなく、(ヘッダー、テキスト、および日付のプロパティを含む) 構造体の配列にデータを保持すると、コードが読みやすく、保守しやすくなる場合があります。

于 2016-03-20T22:53:45.343 に答える