我在 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,然后我认为这导致了错误。
我很确定问题是由空 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)
| 归档时间: |
|
| 查看次数: |
629 次 |
| 最近记录: |