【问题标题】:SwiftUI / Xcode Error - Updating took more than 5 secondsSwiftUI / Xcode 错误 - 更新时间超过 5 秒
【发布时间】:2020-07-14 04:52:57
【问题描述】:

当我尝试在画布中预览我的一个视图时,我不断收到以下错误:

PreviewUpdateTimedOutError:更新时间超过 5 秒

我所有其他视图都加载得很好。

为什么会发生这种情况,我该如何解决?

我在 Xcode 11.4(公开发布)中使用 SwiftUI

【问题讨论】:

  • 之前构建整个项目;将您的视线转移到较小的部分。
  • 我一直在使用新的 Xcode 11.4 以前一切都很好。实际上,这个版本在我正在处理的 SwiftUI 项目中引入了大量问题。
  • @zh 很郁闷????
  • 正如@Asperi 提到的,尝试同时减少预览,将您的代码分成更小的部分。但这仍然是不可预测的——同样的代码现在可能渲染得很好,一分钟后开始出现这个“5秒”问题。其实我发现这个问题正在寻找解决它的解决方案。继续执行和渲染超过 5 秒。不过运气不好。
  • 重新启动 Xcode 在大多数情况下都有帮助。

标签: xcode swiftui


【解决方案1】:

就我而言,问题是构建设置中的这一行:

我不小心更改了项目中的签名设置。具体来说,“签名身份”设置为“签名以在本地运行。”。 由于某些原因,SwiftUI Previews 无法正常工作。

只需从构建设置中删除这一行(也就是设置默认值)即可解决问题。

【讨论】:

    【解决方案2】:

    有时,显示的错误并不是真正的错误。

    对我来说,这是因为我错过了:.environmentObject(...)

    【讨论】:

      【解决方案3】:

      尝试 Clean (Shift + ⌘ + K) 和 Build (⌘ + B) 再次构建 SwiftUI 项目,它适用于 Xcode 11.6。尝试构建一个基本的 hello world 应用。

      【讨论】:

        【解决方案4】:

        从 XCode 12.5.1 开始,消息 PreviewUpdateTimedOutError: Updating took more than 5 seconds 很可能意味着您的应用程序崩溃了,因此更新预览失败。不幸的是,崩溃的真正原因被这条无用的信息所掩盖(为什么苹果会这样做,我无法理解)。要了解真正的原因,您需要:

        • 点击预览顶部无用错误信息旁边的Diagnostics
        • 在下一个对话框中,单击Generate Report > Reveal in Finder

        这需要一点时间。然后 Finder 将打开并突出显示一个文件夹。打开那个文件夹。在里面你会看到很多日志文件和文件夹。

        如果您的应用确实崩溃了,您会看到一个名为 CrashLogs 的文件夹,其中包含您的应用的崩溃日志,包括错误消息和堆栈跟踪。这应该可以帮助您解决导致预览中断的实际错误。

        请注意,对我而言,有时CrashLogs 并未包含在报告中,即使我的应用确实崩溃了。重试预览并生成另一个报告为我解决了这个问题。不幸的是,对于预览版,整个错误报告过程似乎相当不稳定。

        【讨论】:

          【解决方案5】:

          就我而言,问题是PreviewProvider 被标记为private。只需将其设为 internal 或删除 private 访问修饰符。

          private /* <- remove */ struct YourView_Previews: PreviewProvider {
              static var previews: some View {
                  // Your previews
              }
          }
          

          【讨论】:

            【解决方案6】:

            我停止使用模拟器并选择“任何 iOS 设备”并解决了问题。

            【讨论】:

            • 这个解决方案很有帮助。但据我所知,没有万无一失的方法可以解决这个问题。
            【解决方案7】:

            在我的例子中,显示 SwiftUI_preview 所需的 viewModel 是在 viewModel 的 init 中调用 CoreData(快速调用)。

            移动了“reload() 方法”的实际调用,因此不会在预览时调用,已修复。

            (我认为正确的方法是使用模拟协议而不是 viewModel 的实例)

            【讨论】:

              【解决方案8】:

              如果您有 .onAppear 子句,请尝试将其注释掉以供预览。

              【讨论】:

              • 所以自从我更新到 Big Sur 后,我每次都遇到同样的问题。我正在使用 Xcode v12.2。我注释掉了 .onAppear 子句,然后 xcode 游戏我这个错误而不是 5 秒 timout “检查您的构建设置以确保预览提供程序编译到您的产品中。”这到底是什么意思?
              【解决方案9】:

              这些建议都没有帮助我,但我确实发现您不能完全依靠成功的构建来解决所有问题。在我的情况下,我将 '.modifier(modifier:)' 错误地输入为 'modifier(modifier:)'。我的代码构建成功,但在我添加修饰符之前的句点之前我的预览不起作用。

              【讨论】:

                【解决方案10】:

                对我来说,问题与在预览时未找到的元素的强制展开有关。

                注意:始终检查诊断报告。该问题将在终止原因后显示在顶部。

                【讨论】:

                  【解决方案11】:

                  在我的情况下,画布/屏幕尺寸小于内容,因此只需将我的内容包装在 scrollView 中即可消除错误并在画布中显示内容。

                  【讨论】:

                    【解决方案12】:

                    我也遇到了这个问题,没有解决这个问题。我现在在 11.6 上,更新后问题就消失了。我认为这可能是 xcode 11.4 的问题

                    如果可能,我建议更新 xcode。

                    【讨论】:

                      【解决方案13】:

                      我的代码中有一个fatalError("..."),这是我在阅读诊断日志后才发现的。如果 SwiftUI 真的暗示了这一点,那就太好了!

                      您可以通过单击预览窗口顶部“重试”旁边的“诊断”来获取诊断信息。

                      在这里总结很多答案,在真实设备或模拟器上运行时,预览需要一段时间才能更新似乎相当于崩溃。

                      【讨论】:

                        【解决方案14】:

                        在 SwiftUI 中,您不能在 contentview 中添加超过 10 个子视图,否则无法编译。

                        【讨论】:

                          【解决方案15】:

                          我有同样的问题,然后我开始在我的主视图中注释掉子视图,然后尝试再次预览然后我发现问题是因为我忘记在其中一个子视图之前放一个点属性。

                          所以我就是这样解决的。

                          【讨论】:

                            【解决方案16】:

                            原因是找不到 landmarkData.json 文件。为了解决这个问题,

                            1. 在资源中选择 landmark.json 文件。
                            2. 显示检查器(右上角图标)
                            3. 选择显示文件检查器
                            4. 在目标成员资格下,选择/检查地标

                            这应该可以解决预览问题。

                            【讨论】:

                              【解决方案17】:

                              由于某种原因,在 SwiftUI 中,当我在 Scroll View 和 VStack 中嵌入 Text 时,出现了这个错误。在通过清除和构建项目尝试解决此问题几次失败后,我删除了代码并再次将其写下来,就像以前一样。现在它正在工作。

                              【讨论】:

                                【解决方案18】:

                                我将运行设备设置为用于测试的真实设备。当我在模拟器中将其更改为一个时,它又开始工作了。

                                【讨论】:

                                  【解决方案19】:

                                  类似于@YannSteph,这发生在我身上,因为我将.environmentObject() 放在它创建第一个视图的应用程序入口点:

                                  @main
                                  struct RecipeApp: App {
                                      var body: some Scene {
                                          WindowGroup {
                                              RecipeTabView()
                                                  .environmentObject(RecipeModel())
                                          }
                                      }
                                  }
                                  

                                  但这阻止了预览工作。我认为我把它放在那里很聪明,所以所有视图都可以访问它,但它只是让预览崩溃。

                                  将其移回作为我应用的起始视图的主 View.Swift 文件修复了预览问题。

                                  ^^^ 编辑:当我没有将.environmentObject() 放在struct 中进行预览时,又遇到了这个问题。可能是新手错误,但似乎有很多方法可以触发此错误。

                                  【讨论】:

                                    【解决方案20】:

                                    首先注释掉所有用于特定视图的环境对象。获得预览后,取消注释以运行构建。这个技巧对我有用

                                    //@EnvironmentObject var observerObj:PropertyObserver
                                    

                                    【讨论】:

                                      【解决方案21】:

                                      在使用 Xcode 12.5 创建全新的多平台应用程序项目后,我遇到了同样的问题。根据上面的解决方案,我有一个预感,现在认为问题是由于路径参数无效。

                                      在将 Schemes 和 Targets 从 (iOS) 重命名为 .iOS(对于 macOS 也是如此)以删除空格和括号后,它现在可以工作了。

                                      【讨论】:

                                        【解决方案22】:

                                        在更改捆绑包 ID 并从个人签名到团队后,我遇到了这个问题。

                                        按照此处的建议将设备更改为任何设备后,我收到了另一个错误描述,说

                                        无法在 iPhone 12 Pro Max 上安装预览主机“AppName.app”

                                        agentBundle = com.bundle.Its.AppName { url: file:///Users/macbookair/Library/Developer/Xcode/DerivedData/AppName-> desupjbpqvjlegfbskxydixpouvc/Build/Intermediates.noindex/Previews/AppName/Prod> ucts/Debug-iphonesimulator/AppName.app > 版本:49557 签名信息:代码签名{ 标识符:com.bundle.AppName hasGetTaskAllow: 假 isSandboxed: 假 } }

                                        清理构建、删除派生、删除模拟器上安装的所有应用、清理 Xcode 缓存、重新启动 Xcode 和 Mac 均无济于事。

                                        帮助创建具有最初正确包 ID 的新项目并将我的所有文件复制到那里。

                                        【讨论】:

                                          【解决方案23】:

                                          我在 Xcode 12.4 上遇到了同样的问题,但代码在 Xcode 13.0 上运行良好。

                                          【讨论】:

                                            猜你喜欢
                                            • 2018-08-24
                                            • 2021-12-31
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2013-09-27
                                            • 2021-08-25
                                            • 2017-04-15
                                            相关资源
                                            最近更新 更多