можно сделать. Хотя вам не нужно отслеживать столько состояний, сколько вам нужно.
Во-первых, вам нужно только отслеживать, если они потерпели неудачу или нет. Таким образом, ваш failedRegister
будет отслеживать, успешно ли зарегистрирован пользователь или нет. Это означает, что мы можем удалить successfulRegister
.
Нам нужна переменная для отслеживания того, отображается предупреждение или нет, для этого мы будем использовать переменную showAlert
Поскольку у вас есть связанный список, который предоставляет информацию о пользователе, мы будем издеватьсяэто просто массив, содержащий пару имен пользователей.
Итак, вот упрощенная версия вашего кода, которая должна работать.
struct ContentView: View {
var names: [String] = ["John", "Mike"]
@State var username: String = ""
@State var password : String = ""
@State private var failedRegister = false
// this value is used for tracking whether the alert should be shown
@State private var showAlert = false
var body: some View {
VStack {
TextField("Enter username", text: $username)
Button(action: {
// reset to false as this is the initial state
self.failedRegister = false
if (self.names.contains(self.username)){
self.failedRegister.toggle()
} else {
// insert the value into the user info
}
self.showAlert.toggle()
}) {
Text("Register")
.font(.headline)
.foregroundColor(.white)
.padding()
.frame(width: 220, height: 60)
.background(Color.green)
.cornerRadius(15.0)
}
}.alert(isPresented: $showAlert) {
// it would be nice to set failedRegister back to false in this function but you cannot modify state here.
if self.failedRegister {
return Alert(title: Text("Failed to register"), message: Text("Unfortunately that username is taken"), dismissButton: .default(Text("OK")))
} else {
return Alert(title: Text("Welcome"), message: Text("You have registered"), dismissButton: .default(Text("OK")))
}
}
}
}