如何在 SwiftUI 中使用 @State 和 fullScreenCover 在视图之间切换

问题描述

我想弄清楚如何在 SwiftUI 中使用 @State 和 fullScreenCover 在视图之间切换

我有一个主视图和 2 个简单视图(View1View2)。 View1 必须在点击 "Show view 1" 按钮时打开,而在 View2 按钮上输入时必须打开 "Show view 2"。我还为此创建了 2 个 @State 变量,并使用 .View1ActiveFullscreenview 枚举)对其进行了初始化:

 @State private var showFullscreenView = false
 @State private var activeFullscreenView: ActiveFullscreenView = .View1

问题在于,即使我点击 View1 按钮,它也会不断显示 Show view 2。 我认为当点击按钮并给 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

解决方法

在@jnpdx 的帮助下 This Answer that is Similar to My problem 问题解决了。这是代码。只要 fullScreenCover 和 sheet 都是模态,我将 enum 重命名为 ModalView:

struct MainView: View {
    
    // enum to decide which view to present:
    enum ModalView: String,Identifiable { // Identifiable
        
        case View1,View2
        
        var id: String {
            return self.rawValue
        }
    }
    
    @State var activeModalView : ModalView? = nil
    
    var body: some View {
        
        ZStack {
            
            VStack {
                
                // Button to show View 1
                Button("Show view 1",action: {
                    
                    self.activeModalView = .View1
                    
                })
                
                // Button to show View 2
                Button("Show view 2",action: {
                    
                    self.activeModalView = .View2
                    
                })
                
            }
            
        } // use fullScreenCover or sheet depending on your needs
        .fullScreenCover(item: $activeModalView) { activeModalValue in
            
            switch activeModalValue {
            case .View1:
                
                Text("View1")

            case .View2:
                
                Text("View2")
                
            }
        }
        
    }
    
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...