首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SwiftUI列表'NSInternalInconsistencyException',原因:‘尝试插入节0,但更新后只有0个节’

SwiftUI列表'NSInternalInconsistencyException',原因:‘尝试插入节0,但更新后只有0个节’
EN

Stack Overflow用户
提问于 2021-08-26 11:50:40
回答 1查看 174关注 0票数 0

我有以下代码。它需要Xcode13测试版才能编译。当在iOS 14上运行并点击"Insert data“按钮时,它崩溃并出现以下错误:

代码语言:javascript
运行
复制
libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to insert section 0 but there are only 0 sections after the update'
terminating with uncaught exception of type NSException
代码语言:javascript
运行
复制
class MyViewModel: ObservableObject {
    @Published var components: [String] = []
}

struct ComponentListContent: View {
    @EnvironmentObject var viewModel: MyViewModel

    var body: some View {
        ForEach(self.$viewModel.components, id: \.self) { $component in // This syntax requires Xcode 13
            TextField("Component Name", text: $component)
        }
    }
}

struct MySheet: View {
    @EnvironmentObject var viewModel: MyViewModel
    @State private var isSheetPresented = true
    @State var isEditing = false

    var body: some View {
        NavigationView {
            List {
                ComponentListContent()
            }
            .environment(\.editMode, .constant(self.isEditing ? EditMode.active : EditMode.inactive))
            .navigationBarItems(trailing:
                Button(action: { self.isEditing.toggle() }, label: {
                    Text(self.isEditing ? "Done" : "Edit")
                })
            )
            .sheet(isPresented: self.$isSheetPresented) {
                Button("Insert data") {
                    self.isSheetPresented.toggle()
                    self.viewModel.components = ["a", "b", "c", "d"]
                }
            }
            .navigationBarTitle("New Analysis", displayMode: .inline)
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .sheet(isPresented: .constant(true)) {
                MySheet()
                    .environmentObject(MyViewModel())
            }
    }
}

如果我将ComponentListView的主体移到MySheet中,错误不会发生。如果我删除.environment(\.editMode....,它也不会发生。然而,我确实需要这两个。有没有我遗漏的潜在问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-26 12:36:01

这似乎是由于.constant绑定而发生的。

我建议您切换到存储EditMode而不是Bool,并使用将修改它的getter/setter来定义isEditing。您也可以使用@Binding执行同样的操作,但这看起来更简洁一些。

代码语言:javascript
运行
复制
@State var editMode = EditMode.inactive
var isEditing: Bool {
    get {
        editMode.isEditing
    }
    nonmutating set {
        if newValue {
            editMode = .active
        } else {
            editMode = .inactive
        }
    }
}

// subscribe
.environment(\.editMode, $editMode)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68938009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档