【发布时间】:2021-02-12 15:55:46
【问题描述】:
我试图弄清楚如何在 SwiftUI 中使用 @State 和 fullScreenCover 在视图之间切换
我有一个主视图和 2 个简单视图(View1 和 View2)。 View1 必须在点击"Show view 1" 按钮时打开,View2 在"Show view 2" 按钮上键入时打开。我还为此创建了 2 个@State 变量,并使用.View1(ActiveFullscreenview 枚举)对其进行了初始化:
@State private var showFullscreenView = false
@State private var activeFullscreenView: ActiveFullscreenView = .View1
问题在于,即使我点击Show view 2 按钮,它也会不断显示View1。
我认为当点击按钮并将 activeFullscreenView 变量的值设为 .View2 时,它应该更改变量并显示 fullScreenView。
我以为是因为我调用了showFullscreenView,它改变了变量,之后默认值为.View1,所以它没有改变它。
也试过了:
self.showFullscreenView = true
self.activeFullscreenView = .View2
第二个假设是我不应该给这个变量初始值。但在这种情况下,它添加了一些不方便的额外初始化代码:
@State private var activeFullscreenView: ActiveFullscreenView = .View1
目前,我有以下代码存在所描述的问题:
import SwiftUI
struct MainView: View {
enum ActiveFullscreenView {
case View1, View2
}
@State private var showFullscreenView = false
@State private var activeFullscreenView: ActiveFullscreenView = .View1
var body: some View {
ZStack {
VStack {
// Button to show View 1 in FullScreen
Button("Show view 1", action: {
self.activeFullscreenView = .View1
self.showFullscreenView = true
})
// Button to show View 2 in FullScreen
Button("Show view 2", action: {
self.activeFullscreenView = .View2
self.showFullscreenView = true
})
}
}
.fullScreenCover(isPresented: $showFullscreenView) {
switch self.activeFullscreenView {
case .View1:
Text("View1")
case .View2:
Text("View2")
}
}
}
}
struct MainView_Previews: PreviewProvider {
static var previews: some View {
MainView()
}
}
任何与解决问题相关的帮助表示赞赏。关于如何实现使用 fullscreenCover 显示单独视图的相同结果的便捷方法表示赞赏。
使用 Xcode 12.4,最新的 iOS 14
【问题讨论】:
-
这是否回答了您的问题stackoverflow.com/a/65480211/12299030? (你需要
fullScreenCover(item:...) -
@Asperi 嗨,谢谢。我试过了,但出错了,无法正确实现。根据您的示例,我尝试创建
@State var selectedFullscreenView: ActiveFullscreenView?并使用.fullScreenCover(item: $selectedFullscreenView) { _ in switch selectedFullscreenView { case .View1: Text("View1") case .View2: Text("View2") }}但出现错误:Instance method 'fullScreenCover(item:onDismiss:content:)' 要求 'MainView.ActiveFullscreenView' 符合 'Identifiable ' . -
你必须让
ActiveFullScreenViewIdentifiable- 在这个问题的回答中查看我是如何做到ActiveSheet的:stackoverflow.com/questions/66162219/… 如果你需要更多,请告诉我 -
感谢@jnpdx,您的链接帮助很大
标签: swift swiftui xcode12 swiftui-environment swiftui-state