Xcode 12 + iOS 14 Beta 8
我有一个SwiftUI视图,可以根据应用程序的状态显示三个不同的工作表。我认为没有使用三个单独的.sheet修饰符和三个不同的@State属性来处理这些工作表,我认为使用枚举来确定要显示的工作表将是一个很好的解决方案……但是它不起作用。
这是枚举:

enum SheetType: Int, Identifiable {
    case welcome
    case notification
    case assignment

    var id: Int { rawValue }
}
由于视图中的SheetType修饰符,因此.sheet(item:content:)必须符合Identifiable:
struct MainTabView: View {
    @State var sheetType: SheetType?

    var body: some View {
        Text("Hello World!")
        .onAppear(perform: checkForSheet)
        .sheet(item: $sheetType) { _ in
            sheetView
        }
    }
}
出现MainTabView时,checkForSheet会寻找可保证呈现特定工作表的条件,如果有匹配项,则设置sheetType属性,如下所示:sheetType = .welcome。然后,应调用sheetView返回匹配表。
问题是,无论我在代码中的哪个位置更新sheetType的值,它都保持为零。我可以在调试器中看到一秒钟的值更改,但随后在显示工作表之前它又切换回nil。我完全不知所措。是否有明显的我想念的东西,或者这只是另一个错误?

编辑1:
多亏了Asperi的代码,我才能够呈现工作表,但是问题是返回正确工作表的sheetView属性也不起作用。我将其更改为函数,并调整了.sheet修饰符:
.sheet(item: $sheetType) { type in
    createSheetView(of: type)
}

这是createSheetView(of:)的代码。我已在调试器中确认sheetType的值为.welcome,但switch语句仍返回默认值,即无用的EmptyView

func createSheetView(of type: SheetType) -> some View {
    switch sheetType {
    case .welcome: return AnyView(WelcomeSplashView())
    case .notification: return AnyView(NotificationPermissionView(notificationAccessWasGranted: .constant(false)))
    default:
        return AnyView(EmptyView())
    }
}


编辑2:
我是白痴。我忘了将switch语句从switch sheetType(这是视图的@State属性)更改为新的switch type(需要该函数的参数)。现在可以工作了:)

最佳答案

这是一些与Xcode 12b5一起使用的复制代码
ios - 即使分配了值,SwiftUI @State枚举仍然为零-LMLPHP

enum SheetType: Int, Identifiable {
    case welcome
    case notification
    case assignment

    var id: Int { rawValue }
}

struct MainTabView: View {
    @State var sheetType: SheetType?

    var body: some View {
        Text("Hello World!")
        .onAppear(perform: checkForSheet)
        .sheet(item: $sheetType) { _ in
            Text("sheetView")
        }
    }

    func checkForSheet() {
        sheetType = .welcome   // << make sure to update always in main queue
    }
}

09-04 10:05