概要
Widget Extensionは常時実行されているわけではないため、ウィジェットのコンテンツを直接更新することはできません。代わりにWidgetKitがウィジェットのビューをレンダリングし、結果を表示します。一方で、ウィジェットが表示されている間、継続的に更新されるコンテンツを表示できるSwiftUIビューもあります。
ウィジェットのText
ビューを使用して、常に最新の日時を画面に表示できます。以下は利用可能な組み合わせの例です。
自動更新される相対的な時間を表示するには、以下のようにします。
let components = DateComponents(minute: 11, second: 14)
let futureDate = Calendar.current.date(byAdding: components, to: Date())!
Text(futureDate, style: .relative)
// Displays:
// 11 min, 14 sec
Text(futureDate, style: .offset)
// Displays:
// -11 minutes
relative
スタイルを使用すると、現在の日時と、指定された未来または過去の日時との絶対差が表示されます。offset
スタイルでも現在の日時と指定された日時との差が表示されますが、指定された日時が未来の場合は前にマイナス記号(-
)を付けて、過去の場合は前にプラス記号(+
)を付けて表示されます。
継続的に自動更新されるタイマーを表示するには、以下のようにします。
let components = DateComponents(minute: 15)
let futureDate = Calendar.current.date(byAdding: components, to: Date())!
Text(futureDate, style: .timer)
// Displays:
// 15:00
timer
スタイルは、現在の日時が未来の指定日時に到達するまでカウントダウンし、その日時を過ぎるとカウントアップします。
絶対日時を表示するには、以下のようにします。
// Absolute Date or Time
let components = DateComponents(year: 2020, month: 4, day: 1, hour: 9, minute: 41)
let aprilFirstDate = Calendar.current(components)!
Text(aprilFirstDate, style: .date)
Text("Date: \(aprilFirstDate, style: .date)")
Text("Time: \(aprilFirstDate, style: .time)")
// Displays:
// April 1, 2020
// Date: April 1, 2020
// Time: 9:41AM
最後に、2つの日時の間の時間差を表示するには、以下のようにします。
let startComponents = DateComponents(hour: 9, minute: 30)
let startDate = Calendar.current.date(from: startComponents)!
let endComponents = DateComponents(hour: 14, minute: 45)
let endDate = Calendar.current.date(from: endComponents)!
Text(startDate ... endDate)
Text("The meeting will take place: \(startDate ... endDate)")
// Displays:
// 9:30AM-2:45PM
// The meeting will take place: 9:30AM-2:45PM