多个 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的主要内容,如果未能解决你的问题,请参考以下文章

语义 Ui 类 ui 表单破坏了 Angular2 验证

如何在多个线程中访问 UI 元素?

Jquery UI Selectable - 选择多个元素

IE9 - 添加和删除 DOM 元素会破坏父 keydown 事件

angular-ui-select 被 bootstrap form-inline 破坏

Web UI自动化测试基础——元素定位