在将其发布到这里之前,我做了一些研究,但是我无法修复它。
在注册视图中,我希望用户注册。
我创建了一个链接列表,并在用户注册用户名时,我的程序检查用户名是否已被使用。
如果采取了该措施,则应发出警报,提示用户单击注册按钮时该用户名已采取。
如果未使用用户名,则会显示一条警告,提示注册成功
import SwiftUI
struct registerScreen: View {
@State var username: String = ""
@State var password : String = ""
@State private var sucessfulRegister = false
@State private var failedRegister = false
var body: some View {
VStack {
TextField()
SecureField()
Button(action: {
let userinfo = linkedList()
if (userinfo.contains(value: self.username)){
// self.failedRegister = true
self.failedRegister.toggle()
// show alert that it failed
} else {
userinfo.insert(value: user(username: self.username, password: self.password))
// show alert that it is successfull
self.sucessfulRegister.toggle()
}
})
{
Text("Register")
.font(.headline)
.foregroundColor(.white)
.padding()
.frame(width: 220, height: 60)
.background(Color.green)
.cornerRadius(15.0)
}
}
}
}
答案 0 :(得分:1)
可以做到。尽管您不需要跟踪尽可能多的状态。
首先,您只需要跟踪它们是否失败。因此,您的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")))
}
}
}
}
答案 1 :(得分:1)
虽然安德鲁的回答非常有用,但这里是一个“长话短说”的答案,适用于 iOS14:
struct YourView: View {
enum AlertType: Identifiable {
case first, second
var id: Int {
hashValue
}
}
@State var alertType: AlertType?
var body: some View {
VStack {
Button("Show alert #1") {
alertType = .first
}
Button("Show alert #2") {
alertType = .second
}
}
.alert(item: $alertType) { type in
switch type {
case .first:
return Alert(title: Text("First alert"))
case .second:
return Alert(title: Text("Second alert"))
}
}
}
}
答案 2 :(得分:0)
与Andrew解决方案相同,但枚举超出了ContentView的范围,该枚举允许在其他视图中使用,并在一个位置进行分组
enum Choice {
case success
case failure
}
extension Choice: Identifiable {
var id: Choice { self }
}
struct ContentView:View {
.../...
}