是否可以在Widget中创建显示当前时间并实时更新的文本标签?
尝试创建时钟 WidgetKit ,但 WidgetKit 每5分钟仅更新1次。

  • 创建时间线无济于事
  • “使 WidgetKit 保持最新状态”不适用于当前时间,仅适用于计时器等。
  • 最佳答案

    一个可能的解决方案是使用time日期样式:

    /// A style displaying only the time component for a date.
    ///
    ///     Text(event.startDate, style: .time)
    ///
    /// Example output:
    ///     11:23PM
    public static let time: Text.DateStyle
    
  • 您需要一个具有Entry属性的简单Date:
  • struct SimpleEntry: TimelineEntry {
        let date: Date
    }
    
  • 每分钟创建一个Entry,直到下一个午夜:
  • struct SimpleProvider: TimelineProvider {
        ...
    
        func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
            var entries = [SimpleEntry]()
            let currentDate = Date()
            let midnight = Calendar.current.startOfDay(for: currentDate)
            let nextMidnight = Calendar.current.date(byAdding: .day, value: 1, to: midnight)!
    
            for offset in 0 ..< 60 * 24 {
                let entryDate = Calendar.current.date(byAdding: .minute, value: offset, to: midnight)!
                entries.append(SimpleEntry(date: entryDate))
            }
    
            let timeline = Timeline(entries: entries, policy: .after(nextMidnight))
            completion(timeline)
        }
    }
    
  • 使用time样式显示日期:
  • struct SimpleWidgetEntryView: View {
        var entry: SimpleProvider.Entry
    
        var body: some View {
            Text(entry.date, style: .time)
        }
    }
    

    如果要自定义日期格式,可以使用自己的DateFormatter:
    struct SimpleWidgetEntryView: View {
        var entry: SimpleProvider.Entry
    
        static let dateFormatter: DateFormatter = {
            let formatter = DateFormatter()
            formatter.locale = Locale(identifier: "en_US_POSIX")
            formatter.dateFormat = "HH:mm"
            return formatter
        }()
    
        var body: some View {
            Text("\(entry.date, formatter: Self.dateFormatter)")
        }
    }
    

    这是一个GitHub repository,带有不同的 WidgetKit 示例,包括Clock Widget。

    10-08 01:03