当前位置: 首页 > 面试题库 >

在将“ NavigationLink”放入“ NavigationView”中的“ navigationBarItems”内部后,为什么向后导航时我的SwiftUI应用会崩溃?

甄霖
2023-03-14
问题内容

最小的可重现示例(Xcode 11.2 beta,在Xcode 11.1中有效):

struct Parent: View {
    var body: some View {
        NavigationView {
            Text("Hello World")
                .navigationBarItems(
                    trailing: NavigationLink(destination: Child(), label: { Text("Next") })
                )
        }
    }
}

struct Child: View {
    @Environment(\.presentationMode) var presentation
    var body: some View {
        Text("Hello, World!")
            .navigationBarItems(
                leading: Button(
                    action: {
                        self.presentation.wrappedValue.dismiss()
                    },
                    label: { Text("Back") }
                )
            )
    }
}

struct ContentView: View {
    var body: some View {
        Parent()
    }
}

问题似乎在于将我放置NavigationLinknavigationBarItems嵌套于SwiftUI视图(其根视图为)的修改器内部NavigationView。崩溃报告指出,我试图弹出来,当我浏览着那个不存在的视图控制器Child,然后返回Parent

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'
*** First throw call stack:

如果我将其放置NavigationLink在如下所示的视图主体中,则效果很好。

struct Parent: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: Child(), label: { Text("Next") })
        }
    }
}

这是SwiftUI错误还是预期行为?

编辑:我已经在Apple的反馈助理中用ID打开了一个问题,FB7423964以防Apple有人担心:)。

编辑:我在反馈助手中打开票证表明有10多个类似的已报告问题。他们已使用更新了分辨率Resolution: Potential fix identified - For a future OS update。手指交叉,修复很快就到了。

编辑:这已在iOS 13.3中修复!


问题答案:

这对我来说是很痛苦的一点!我把它留了下来,直到我的大多数应用程序完成为止,并且我有足够的空间来处理崩溃问题。

我认为我们都可以同意SwifUI有一些很棒的东西,但是调试可能很困难。

我认为这是一个错误。这是我的基本原理:

  • 如果以大约半秒的异步延迟包装presentationMode dismiss调用,则应该发现程序不再崩溃。

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    self.presentationMode.wrappedValue.dismiss()
    

    }

  • 这向我表明,该错误是SwiftUI如何与所有其他UIKit代码进行接口以管理各种视图的一个无法预料的行为。根据您的实际代码,您可能会发现,如果视图中的复杂性较小,则崩溃实际上不会发生。例如,如果您从一个视图中退出到一个具有列表的视图,并且该列表为空,则将在没有异步延迟的情况下崩溃。另一方面,如果在该列表视图中甚至只有一个条目,则强制循环迭代以生成父视图,您将看到崩溃不会发生。

I’m not so sure how robust my solution of wrapping the dismiss call in a delay
is. I have to test it much more. If you have ideas on this, please let me
know! I’d be very happy to learn from you!



 类似资料:
  • 这是我第一次问有关StackOverflow的问题。我的问题如下: 我有一个生产者和消费者类。在Producer类中,我逐行读取文件,并将这些文本行放入字符串列表中。当列表的行数为x时。此列表将添加到ArrayBlockingQueue。我有一个在主线程中启动的生产者线程。除此之外,我还启动了几个消费者线程。使用者线程从队列中获取一个项目,该项目应该是一个列表,并遍历该行列表以查找特定单词。找到单

  • 问题内容: 在SwiftUI中,每当导航栏被隐藏时,向后滑动手势也将被禁用。 在保留SwiftUI中的向后滑动手势的同时,有什么方法可以隐藏导航栏?我已经有一个自定义的“后退”按钮,但仍然需要该手势。 我已经看到了UIKit的一些解决方案,但仍然不知道如何在SwiftUI中进行操作 这是尝试代码的代码: 任何建议或解决方案,不胜感激 问题答案: 这应该通过扩展来起作用。

  • Logcat消息: java.lang.IllegalStateException:在Android的父上下文或祖先上下文中找不到方法@={()->ViewModel.OnBtnClicked()(View):在id为“button”的视图类AndroidX.AppCompat.Widget.AppCompatButton上定义的OnClick属性 文件1:activity_main.xml 文件

  • 问题内容: 如果我多次将相同的键传递给的方法,那么原始值会怎样?如果值重复出现该怎么办?我没有找到任何文档。 情况1:密钥的覆盖值 我们得到surely not one。 情况2:重复值 我们得到。 但是其他值怎么办?我在向学生教授基础知识,有人问我。是等,其中最后一个值引用(但在内存中)水桶? 问题答案: 根据定义,该命令将替换与映射中给定键相关联的先前值(概念上类似于对原始类型的数组索引操作)

  • 我试图建立一个视频播放Android应用程序使用Kotlin。我遵循了以下教程https://www.raywenderlich.com/14273655-mediaplayer-simplifed-video-playback-on-Android 我的视频可以播放,但当我退出应用程序并重新进入它,或关闭屏幕并再次打开时,视频图像会变成黑色,尽管音频仍在播放。 我尝试使用onRestart()、

  • 我有一个ViewModel处理我的业务逻辑,我正在使用Koin将它注入到我的活动和每个片段中。然而,在我从片段A-片段B导航并导航回片段A之后,我的观察者再次被触发。为什么会发生这种情况?当我返回时,如何阻止这种onChanged被触发? 我尝试将'this'和'view LifecycleOwner'设置为LiveData的LifecycleOwner。 我还尝试将observable移动到on