如何在SwiftUI中自动显示模式而无需按钮

问题描述

我正在考虑使用开关盒来呈现不同的视图。

struct searchview : View {

 var body: some View {
      vstack {

            vstack {
                     if self.speechRecognition.isPlaying == true {
                         vstack {
                             Text(self.speechRecognition.recognizedText).bold()
                            .foregroundColor(.white)
                            .frame(minWidth: 0,maxWidth: .infinity,minHeight: 0,maxHeight: .infinity,alignment: .center)
                            .font(.system(size: 50))
                            
                            .sheet(isPresented: $showSheet) {
                                self.sheetView
                            }
                         }.onAppear {
                             dispatchQueue.main.asyncAfter(deadline: .Now() + 2) {
                                 self.showSheet = true
                             }
                         }
                        }
       }.onAppear(perform: getViews)

 
 }
     
var currentSheetView: String {
    var isProductDictEmpty = Global.productDict.isEmpty
    var wasTextRecognizedEmpty = self.speechRecognition.recognizedText.isEmpty
    var checkTextandDict = (wasTextRecognizedEmpty,isProductDictEmpty)
 

    switch checkTextandDict {

    case (true,true):

        print("Product dict and Text rec are empty")
        return "error"

    case (false,false):
        print("Yes we are in business")
        return "product"


    case (true,false):
        print("OOPS we didnt catch that")
        return "error"
        
    case (false,true):
        print("OOPS we didnt catch that")
    return "zero match"
    
        
    }
  }
   @viewbuilder
   var sheetView: some View {

    if currentSheetView == "product"  {
          ProductSearchView(model: self.searchModel)
      }
    else if currentSheetView == "zero match" {
         zeroResult()
    }
    else if currentSheetView == "error" {
        SearchErrorView()
    }
    
    
  }
    
     }

 }

我知道如何在按下按钮时使用.sheet修饰符来呈现模态,但是如何在快捷的情况下通过按钮自动呈现各自的模态?

更新

这些是我要实现的视图

struct SearchErrorView: View {
   var body: some View {
      vstack {
          Text("Error!")
          Text("Oops we didn't catch that")
      }
    }
 }

struct zeroResult: View {
  var body: some View {
    Text("Sorry we did not find any result for this item")
   }
}

我不确定自己做错了什么。我尝试实现以下解决方案,但仍无法使用切换案例调用视图。

解决方法

解决方案是以编程方式设置一个变量来控制工作表的显示。

您可以尝试以下方法在onAppear中显示工作表:

struct ContentView: View {
    @State var showSheet = false

    var body: some View {
        Text("Main view")
            .sheet(isPresented: $showSheet) {
                self.sheetView
            }
            .onAppear {
                self.showSheet = true
            }
    }
    
    var currentSheetView: String {
        "view1" // or any other...
    }

    @ViewBuilder
    var sheetView: some View {
        if currentSheetView == "view1" {
            Text("View 1")
        } else {
            Text("View 2")
        }
    }
}

您也可以延迟它:

.onAppear {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        self.showSheet = true
    }
}

只需设置self.showSheet = true即可显示工作表。触发方式由您决定。