【发布时间】: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)
}
}
【问题讨论】:
-
我看到同样的事情。请提交反馈!