Как создать кнопку, которую можно нажимать несколько раз для новых представлений? [SwiftUI]

У меня есть кнопка ("Следующее слово"), при нажатии которой отображается новое представление ("PracticeResult"). Идея состоит в том, что каждый раз, когда вы нажимаете ее, на экране появляется новое случайное слово. Но до сих пор мне приходилось дважды нажимать кнопку, чтобы показать следующее изображение, потому что оно запускается с логическим состоянием.

Я попытался изменить состояние обратно на false с помощью переключателя «.onAppear», но это не сработало. Я также пытался использовать исходное состояние, чтобы переключить переменную обратно в false, но это тоже не сработало. Я новичок в SwiftUI, поэтому буду признателен за любые советы! Заранее спасибо.

struct PracticeView: View {
    @State var isTapped: Bool = false
    
    var body: some View {
        NavigationView {
            ZStack {
                Color.white
                VStack() {
                    Image("lightlogolong")
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: 300.0, height: 100.0)
                        .cornerRadius(100)
                        .animation(.easeIn, value: 10)
                    
                    NavigationLink(destination:
                        ContentView().navigationBarBackButtonHidden(true) {
                        HomeButton()
                    }

                    Group {
                        if (isTapped == true){
                            PracticeResult()      
                        }
                    }.onAppear{
                        isTapped.toggle()
                    }

                    Button("Next Word", action:{
                        self.isTapped.toggle()
                    })
                    .padding()
                    .frame(width: 150.0, height: 40.0)
                    .font(.title2)
                    .accentColor(.black)
                    .background(Color("appblue"))
                    .clipShape(Capsule())

                }
            }
        }
    }
}
5 дизайнов темных кнопок с использованием HTML и CSS
5 дизайнов темных кнопок с использованием HTML и CSS
Здесь представлены пять дизайнов темных кнопок с кодом с использованием HTML и CSS:
1
0
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать этот простой подход, используя UUID или что-то подобное, чтобы запускать просмотр PracticeResult каждый раз, когда вы нажимаете кнопку. Обратите особое внимание на PracticeResult().id(isTapped)

 struct PracticeView: View {
     @State var isTapped: UUID? // <--- here
     
     var body: some View {
         NavigationView {
             ZStack {
                 Color.white
                 VStack() {
                     Image("lightlogolong")
                         .resizable()
                         .aspectRatio(contentMode: .fit)
                         .frame(width: 300.0, height: 100.0)
                         .cornerRadius(100)
                         .animation(.easeIn, value: 10)

                     NavigationLink(destination:
                         ContentView().navigationBarBackButtonHidden(true) {
                         HomeButton()
                     }
  
                     if isTapped != nil {
                         PracticeResult().id(isTapped)  // <--- here
                     }
                     
                     Button("Next Word", action:{
                         isTapped = UUID()  // <--- here
                     })
                     .padding()
                     .frame(width: 150.0, height: 40.0)
                     .font(.title2)
                     .accentColor(.black)
                     .background(Color.blue)
                     .clipShape(Capsule())
                 }
             }
         }
     }
 }

 // for testing
 struct PracticeResult: View {
    @State var randomWord: String = UUID().uuidString
    var body: some View {
       Text(randomWord)
   }
}

если вы хотите, чтобы ваша кнопка срабатывала a new random word appears on the screen, вы должны использовать кнопку, чтобы изменить это random word

например (вы можете попробовать это в Preview):

struct PracticeView: View {
    let words = ["one","two","three"]
    @State var wordToDisplay: String?
    
    var body: some View {
        VStack {
            if let wordToDisplay = wordToDisplay {
                Text(wordToDisplay)
            }
            Spacer()
            Button("Next Word") {
                wordToDisplay = words.filter { $0 != wordToDisplay }.randomElement()
            }
        }.frame(height: 50)
    }
}

Другие вопросы по теме