【问题标题】:iOS 14 Widgets: Widget not rendering when list is used [duplicate]iOS 14小部件:使用列表时小部件不呈现[重复]
【发布时间】:2020-11-22 18:19:45
【问题描述】:

我正在尝试使用 iOS 14 小部件,但遇到了一个奇怪的问题。当我在小部件视图中使用 List 时,我的小部件未加载。如果我使用HStackVStack 等,一切正常。

这里有一些简单的代码作为示例:

struct WidgetView: View {

   var body: some View {
    
       List {
           Text("Test 1")
           Text("Test 2")
       }
   }
}

结果我看到了这张图片:

同样,这一切都适用于其他元素,这仅适用于 List

【问题讨论】:

  • 我认为是因为Widget不能有滚动功能
  • 小部件不是交互式的(除了点击打开应用程序),那么为什么需要列表呢?使用堆栈。

标签: swift swiftui ios14 swiftui-list widgetkit


【解决方案1】:

List 有一个小部件不支持的滚动功能,小部件只显示静态视图,请尝试使用 forEach。

例如:

struct SomeView: View {
    
    var body: some View {
        HStack {
            ForEach(1..<5) { index in
                otherView()
            }
        }
    }
}

您可以根据需要和设计使用 HStack 或 VStack。

【讨论】:

    【解决方案2】:

    Widgets 不支持滚动,这个限制在meet widget video of apple 中有讲(视频中可以快进到12:02)

    我遇到了完全相同的问题,有两个部分可以解决这个问题

    1. 确保您的模型符合Identifiable 协议或至少有一个字段作为主键

    示例:假设您有一个名为 Task 的结构

       struct Task: Identifiable {
       let title,id:String
       }
    

    这是TimelineEntry 结构的样子

    struct TaskEntry: TimelineEntry {
    let tasks: [Task]
    let date: Date
    }
    
    1. 完成此操作后,您可以使用 ForEach 循环来使用数组构造视图

      struct ToDoAppWidgetEntryView : View {
      var entry: Provider.Entry
      
      var body: some View {
       VStack{
           ForEach(entry.tasks, id:\.id){
               item in
               Text(item.title)
               Divider()
           }
          }
         }
      }
      

    这是预览的样子

    【讨论】:

    • 您好,我正在使用这种精确的方法。但我得到重复的任务 1 标题而不是标题 1 和标题 2 ..:/
    猜你喜欢
    • 2021-01-10
    • 2020-10-18
    • 2021-03-05
    • 1970-01-01
    • 2017-10-27
    • 2021-03-14
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多