在swiftui中单击按钮后如何根据条件显示不同的警报

在将其发布到这里之前,我做了一些研究,但是我无法修复它。

在注册视图中,我希望用户注册。

我创建了一个链接列表,并在用户注册用户名时,我的程序检查用户名是否已被使用。

如果采取了该措施,则应发出警报,提示用户单击注册按钮时该用户名已采取。

如果未使用用户名,则会显示一条警告,提示注册成功

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)
                }
        }
    }
}
xiaoxia20008 回答:在swiftui中单击按钮后如何根据条件显示不同的警报

可以做到。尽管您不需要跟踪尽可能多的状态。

首先,您只需要跟踪它们是否失败。因此,您的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")))
            }
        }
    }
}

,

虽然安德鲁的回答非常有用,但这里是一个“长话短说”的答案,适用于 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"))
            }
        }
    }
}
,

与Andrew解决方案相同,但枚举超出了ContentView的范围,该枚举允许在其他视图中使用,并在一个位置进行分组

enum Choice {
    case success
    case failure
}

extension Choice: Identifiable {
    var id: Choice { self }
}

struct ContentView:View {
    .../...
}
本文链接:https://www.f2er.com/3149232.html

大家都在问