多个 ui 元素破坏了 WidgetExtension
Posted
技术标签:
【中文标题】多个 ui 元素破坏了 WidgetExtension【英文标题】:Multiple ui elements break WidgetExtension 【发布时间】:2021-03-14 21:16:39 【问题描述】:我正在尝试使用 SwiftUI 为我的小部件动态构建视图。但是,当多个视图堆叠时,小部件不再起作用。 我想在一组获取的数据上循环我的小部件,如下所示:
VStack
ForEach(entry.layers.indices) index in
let layer = entry.layers[index]
Text(layer)
但是当 forEach 循环超过 5 次时,这不能正常工作(它只循环一次或两次时工作正常!)。我就此联系了 Apple Code Level Support,他们告诉我这是一个“错误”。查看我提供的示例项目:https://github.com/swifty-on-me/Widget-Example
这是我要渲染的数据:https://github.com/swifty-on-me/Widget-Example/blob/main/Data/FakeData.swift
我尝试了类似 converting a view to image 的方法,但该解决方案在 Extensions 中不起作用。
所以我在 Apple 开发者论坛上找到了这个“解决方法”,但我不确定如何实现它: https://developer.apple.com/forums/thread/665935
有人可以解释或指导我解决此问题吗? (我对 Swift(UI) 不太熟悉)
我已经在这个问题上搞砸了好多年了,我想我对这看似简单的任务要发疯了。
看这个例子(大约 28 秒)
【问题讨论】:
【参考方案1】:我也有同样的问题。我尝试在小部件中显示日历的月份视图(以及来自我的应用程序的其他信息)。我使用 ForEach 和许多 VStack 和 HStack。小部件的加载非常不可靠。我仍在尝试找出导致此问题的原因,但我发现了一件事……当我从下午 2 点左右(当地时间午夜)测试它时,该小部件确实加载成功。 (从 Xcode 和 TestFlight 启动应用程序时)我知道这很奇怪,但现在发生在我身上。
是的,从小部件中删除一些元素可以成功加载小部件。
谢谢 恩惠
【讨论】:
这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起更多的关注这个问题。【参考方案2】:看起来您正在与 SwiftUI 的工作方式背道而驰。您不应该在视图声明中包含代码。我很惊讶代码竟然被编译了。
这就是问题所在:
GeometryReader geo in
ZStack(alignment: .topLeading)
Color.init("#bf1b49")
VStack
ForEach(entry.layers.indices) index in
let layer = entry.layers[index] // < Here
Text(layer)
我不完全确定您要在这里做什么,但您不需要两行代码即可。您可以尝试将entry.layers[index]
移动到文本中,因为您不需要为此存储变量。像这样:
GeometryReader geo in
ZStack(alignment: .topLeading)
Color.init("#bf1b49")
VStack
ForEach(entry.layers.indices) index in
Text(entry.layers[index])
注意let layer
是如何消失的,而构成layer
的代码现在直接在文本中。希望这会有所帮助!
【讨论】:
感谢您的提示,但不幸的是,这并不能解决问题。 @Kipnoedels 尝试将小部件连接到 Xcode 调试器。是否存在内存峰值? 不,它在 widgetExtension 上保持在 0.18% 左右。 Cpu 也很低。 不幸的是,没有人能够解决这个问题,但我认为不奖励尝试过的人也很糟糕。所以我在只剩 11 分钟的时候提供赏金。以上是关于多个 ui 元素破坏了 WidgetExtension的主要内容,如果未能解决你的问题,请参考以下文章
IE9 - 添加和删除 DOM 元素会破坏父 keydown 事件