SwiftUI - FatalError:接受数量应该减少的工作表时索引超出范围

Cha*_*age 1 swiftui

我在 SwiftUI 应用程序中有一个弹出表,应该允许我接受我可以属于的任何新组的邀请 - 弹出表是一个选项卡视图,允许我在所有不同的邀请之间滑动,并且当我接受或拒绝它们时,它们就会消失。

@main但是,每当我接受或拒绝最终邀请时,我的应用程序就会崩溃。

该邀请表有一个视图模型,其属性是我所有待处理邀请的数组。它为每个待处理的邀请构造一个带有选项卡的 tabView。工作表视图有一个“sheetCount”状态变量,该变量应该随着邀请被接受而减少,然后在工作表计数达到零时关闭该工作表。

我怀疑正在发生的事情是在sheetCount达到零之前待处理的邀请减少到零,并且在尝试在没有可用选项卡的情况下渲染它时出现一些问题,这导致了崩溃。但崩溃错误似乎不具体:

2021-11-05 08:59:07.036721-0400 GoalTogether[748:24652] [UICollectionViewRecursion] cv == 0x1052d2800 Disabling recursion trigger logging
Swift/ContiguousArrayBuffer.swift:580: Fatal error: Index out of range
2021-11-05 08:59:29.996209-0400 GoalTogether[748:24652] Swift/ContiguousArrayBuffer.swift:580: Fatal error: Index out of range
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来构造此代码流,以便sheetCount 直接遵循pendingInvitations 的数量,并在从属性中删除最后一个pendingViewModel 后立即关闭工作表?

这是弹出表,其中包含所有pendingInviteViewModels内容groupHubViewModel并为每个待处理的邀请构建邀请的选项卡视图。

struct PendingGroupsSheet: View {
    
    @ObservedObject var groupHubVM: GroupHubViewModel
    
    @State var sheetCount: Int
    
    @Environment(\.presentationMode) var presentationMode
    
    init(groupHubVM: GroupHubViewModel) {
        self.groupHubVM = groupHubVM
        
        self._sheetCount = State(initialValue: groupHubVM.pendingInviteViewModels.count)
    }
    
    var body: some View {
        TabView {
            ForEach(groupHubVM.pendingInviteViewModels) { singleGroupVM in
                PendingGroupInviteView(singleGroupVM: singleGroupVM, onAcceptDecline: {
                    self.dismissIfEmpty()
                })
            }
        }.tabViewStyle(PageTabViewStyle())
    }
    
    func dismissIfEmpty() {
        sheetCount -= 1
        if sheetCount > 0 {
            return
        } else {
            self.presentationMode.wrappedValue.dismiss()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

TabView 具有这些待处理的群组邀请视图,其中包含接受和拒绝按钮:

                Button(action: {
                    self.onAcceptDecline()
                    do {
                        try singleGroupVM.declineGroupInvitation()
                    } catch {
                        print(error.localizedDescription)
                    }
                }){
                    Text("Decline")
                }.buttonStyle(RoundedRectangleBlackButtonStyle())
                .padding()
Run Code Online (Sandbox Code Playgroud)

这些按钮中的任何一个都应该接受或拒绝邀请,这将使用工作表中的功能减少此页面pendingInviteViewModels主页中的数量。groupHubViewModeldismissIfEmpty

一旦最后一个被拒绝或接受,dismissIfEmpty 函数应该将sheetCount 设置为0,并关闭该工作表。但我认为发生了一些事情,在sheetCount 减少之前,pendingViewModels 必须设置为0 或nil,然后我认为这导致了错误。

Cha*_*age 7

我很确定问题是由空 TabView 引起的。接受邀请和sheetCount导致工作表消失之间似乎有一个间隙,在此期间我有一个空的TabView。

如果我将 TabView 包装在 if 语句中,确认endingInviteViewModels 的计数至少为 1,则可以解决此问题:

        if groupHubVM.pendingInviteViewModels.count >= 1 {
            TabView {
                ForEach(groupHubVM.pendingInviteViewModels) { singleGroupVM in
                    PendingGroupInviteView(singleGroupVM: singleGroupVM, onAcceptDecline: {
                        self.dismissIfEmpty()
                    })
                }
            }.tabViewStyle(PageTabViewStyle())
        }
Run Code Online (Sandbox Code Playgroud)