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
(需要该函数的参数)。现在可以工作了:) 最佳答案
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
}
}