【问题标题】:Removing SwiftUI NavigationView from view hierarchy result in EXC_BAD_ACCESS从视图层次结构中删除 SwiftUI NavigationView 会导致 EXC_BAD_ACCESS
【发布时间】:2022-10-21 20:24:35
【问题描述】:

我正在与一个错误作斗争,我似乎无法解决它,或者在哪里进一步寻找。

当我尝试从视图层次结构中删除视图(包含 NavigationView)时,就会出现问题。它崩溃了:Thread 1: EXC_BAD_ACCESS (code=1, address=0x10)

在试用了消毒剂后,我在调试器中得到了这个输出:*** -[_TtGC7SwiftUI41StyleContextSplitViewNavigationControllerVS_19SidebarStyleContext_ removeChildViewController:]: message sent to deallocated instance 0x10904c880

这让我发现它是以某种方式导致它的 NavigationView 。但我仍然不知道如何从这里出发。

此问题仅发生在真实设备上,它在模拟器中运行良好,您可能必须登录,然后在崩溃发生之前注销并重新登录几次。

我用示例制作了一个示例应用程序:https://github.com/Surferdude667/NavigationRemoveTest

代码如下:

NavigationRemoveTestApp

@main
struct NavigationRemoveTestApp: App {
    var body: some Scene {
        WindowGroup {
            RootView()
        }
    }
}

根视图

struct RootView: View {

    @StateObject private var viewModel = RootViewModel()

    var body: some View {
        if !viewModel.loggedIn {
            WelcomeView()
        } else {
            ContentView()
        }
    }
}

根视图模型

class RootViewModel: ObservableObject {

    @Published var loggedIn = false

    init() {
        LogInController.shared.loggedIn
            .receive(on: DispatchQueue.main)
            .assign(to: &$loggedIn)
    }
}

欢迎查看

struct WelcomeView: View {
    var body: some View {
        NavigationView {
            VStack {
                Text("Welcome")
                NavigationLink("Go to login") {
                    LogInView()
                }
            }
        }
    }
}

登录查看

struct LogInView: View {
    var body: some View {
        VStack {
            Text("Log in view")
            Button("Log in") {
                LogInController.shared.logIn()
            }
        }
    }
}

内容视图

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Content view")
            Button("Log out") {
                LogInController.shared.logOut()
            }
        }
    }
}

登录控制器

import Combine
class LogInController {

    static let shared = LogInController()

    var loggedIn: CurrentValueSubject<Bool, Never>

    private init() {
        self.loggedIn = CurrentValueSubject<Bool, Never>(false)
    }

    func logIn() {
        self.loggedIn.send(true)
    }

    func logOut() {
        self.loggedIn.send(false)
    }
}

【问题讨论】:

  • 我看到同样的事情。请提交反馈!

标签: swiftui navigationview


【解决方案1】:

我找到了一些解决方案。

  1. 要么你用 NavigationView 包装 RootView 中的 if 语句,而不是在实际视图中使用 NavigationView,它可以工作。然而,这不是很方便,因为现在所有内容都包含在 NavigationView 中。

  2. 用新的 iOS 16 NavigationStack 替换 NavigationView 也可以解决它。

【讨论】:

    【解决方案2】:

    Omg mate,我遇到了同样的问题,因为这个帖子它已经解决了。但是你不觉得这是一个非常奇怪的错误吗?确实找到了有关根本原因的更多信息。尽管如此,你还是让我开心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多