コンプリケーションの設定方法を学ぶために、インターネット上の多くのチュートリアルに従ってきました。コンプリケーションを期待どおりにセットアップするのに問題はありません。
最初のタイムライン エントリが期限切れになるまで。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) -> Void) {
handler([.Forward])
}
ここでは、タイムラインの開始時刻を現在と等しくなるように設定します。
func getTimelineStartDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
handler(NSDate())
}
ここでは、タイムラインの終了時間を今から 12 時間後に設定します。
func getTimelineEndDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
handler(NSDate(timeIntervalSinceNow: (60 * 60 * 12)))
}
ここで、コンプリケーションのテンプレートを作成します。これは、ユーザーがウォッチですべてのコンプリケーションを参照しているときに、私のコンプリケーションが表示されたときにサンプル データを表示するためです。
func getPlaceholderTemplateForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTemplate?) -> Void) {
let headerTextProvider = CLKSimpleTextProvider(text: "Some Data")
let body1TextProvider = CLKSimpleTextProvider(text: "Some Data Time")
let template = CLKComplicationTemplateModularLargeStandardBody()
template.headerTextProvider = headerTextProvider
template.body1TextProvider = body1TextProvider
handler(template)
}
これにより、コンプリケーションの最初のタイムライン エントリが作成されます。コンプリケーションが有効になるとすぐに、このコードが実行され、それに応じてコンプリケーションがすぐに入力されます。
func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimelineEntry?) -> Void) {
createData()
if complication.family == .ModularLarge {
if dataArray.count != 0 {
let firstData = dataArray[0]
let headerTextProvider = CLKSimpleTextProvider(text: firstData.name)
let body1TextProvider = CLKSimpleTextProvider(text: firstData.startString)
let template = CLKComplicationTemplateModularLargeStandardBody()
template.headerTextProvider = headerTextProvider
template.body1TextProvider = body1TextProvider
let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(), complicationTemplate: template)
handler(timelineEntry)
} else {
let headerTextProvider = CLKSimpleTextProvider(text: "No Data")
let body1TextProvider = CLKSimpleTextProvider(text: "Create some data")
let template = CLKComplicationTemplateModularLargeStandardBody()
template.headerTextProvider = headerTextProvider
template.body1TextProvider = body1TextProvider
let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(), complicationTemplate: template)
handler(timelineEntry)
}
} else {
handler(nil)
}
}
これは、現在持っているすべてのデータのタイムライン エントリを作成する場所です。
func getTimelineEntriesForComplication(complication: CLKComplication, afterDate date: NSDate, limit: Int, withHandler handler: ([CLKComplicationTimelineEntry]?) -> Void) {
createData()
var entries = [CLKComplicationTimelineEntry]()
for dataObject in dataArray {
if entries.count < limit && data.startDate.timeIntervalSinceDate(date) > 0 {
let headerTextProvider = CLKSimpleTextProvider(text: dataObject.name)
let body1TextProvider = CLKSimpleTextProvider(text: dataObject.startString)
let template = CLKComplicationTemplateModularLargeStandardBody()
template.headerTextProvider = headerTextProvider
template.body1TextProvider = body1TextProvider
let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(timeInterval: (-10*60), sinceDate: data.startDate), complicationTemplate: template)
entries.append(timelineEntry)
}
}
handler(entries)
}
これにより、コンプリケーション データをいつ更新するかが時計に通知されます。
func getNextRequestedUpdateDateWithHandler(handler: (NSDate?) -> Void) {
handler(NSDate(timeIntervalSinceNow: 60 * 60 * 6))
}
これは私が問題に直面しているところです。
新しいデータを作成してタイムラインをリロードするにはどうすればよいですか? 流れは?タイムラインを延長しようとしているのではなく、完全に置き換えようとしています。私は完全に途方に暮れています。この点に関しては、Appleのドキュメントはかなりあいまいです。次のメソッドを実装する必要があることはわかっていますが、方法がわかりません。誰かがこのコードを記入するのを手伝ってくれますか?
func requestedUpdateDidBegin() {
createData() //I assume createData() goes here? If so, how do I populate the new timeline entries based on the results?
}
func requestedUpdateBudgetExhausted() {
//This can't possibly be the case as I haven't gotten it to work once.
}
func reloadTimelineForComplication(complication: CLKComplication!) {
//This method appears to do nothing.
}
アップデート:
El Teaのおかげで、うまくいきました。CLKComplicationServer のインスタンスを requestedUpdateDidBegin に追加し、内部に reloadTimeline メソッドを配置する必要があります。
更新されたコードは次のとおりです。
func requestedUpdateDidBegin() {
print("Complication update is starting")
createData()
let server=CLKComplicationServer.sharedInstance()
for comp in (server.activeComplications) {
server.reloadTimelineForComplication(comp)
print("Timeline has been reloaded!")
}
}
func requestedUpdateBudgetExhausted() {
print("Budget exhausted")
}