У меня есть кнопка ("Следующее слово"), при нажатии которой отображается новое представление ("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())
}
}
}
}
}
Вы можете попробовать этот простой подход, используя 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)
}
}