e.iluf
e.iluf

Reputation: 1659

How to present modal in SwiftUI automatically without button

I am thinking of using a switch case to present different views.

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()
    }
    
    
  }
    
     }

 }

I know how to use .sheet modifier to present modal when a button is pressed but how could I the present the respective modals in swift cases automatically with button?

UPDATE

these are the views I am trying to implement

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")
   }
}

I'm not sure what I am doing wrongly. I tried to implement the solution below but still not able to call the views with the switch cases.

Upvotes: 3

Views: 1519

Answers (1)

pawello2222
pawello2222

Reputation: 54661

The solution is to programmatically set a variable controlling displaying of your sheet.

You can try the following to present your sheet in 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")
        }
    }
}

You may delay it as well:

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

Just setting self.showSheet = true will present the sheet. It's up to you how you want to trigger it.

Upvotes: 4

Related Questions