gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:35:40 26 4
gpt4 key购买 nike

我在这里发布之前做了一些研究,但我无法修复它。
在注册 View 中我希望用户注册。
我创建了一个链接列表,当用户注册用户名时,我的程序检查用户名是否已被使用。
如果它被占用,它应该在用户单击注册按钮时发出警报,说明用户名已被占用。
如果未使用用户名,则应显示注册成功的警报

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)

}

}

}

}

最佳答案

这是可能的。尽管您不需要跟踪尽可能多的状态。
首先,您只需要跟踪它们是否失败。所以你的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")))
}
}
}
}


使用可识别更新
有另一种显示不同的方法 Alerts在同一个 View .这是使用绑定(bind)到 Identifiable 的对象。 .
如果我们看看我们可以初始化 Alert 的方法在 View我们看到有两种方法。第一个具有以下签名:
.alert(isPresented: Binding<Bool>, content: () -> Alert)
这是上面示例中使用的。
但是,还有第二种方法具有以下签名:
.alert(item: Binding<Identifiable?>, content: (Identifiable) -> Alert)
第二种方式可以允许管理更复杂的警报。为了利用这一点,我们需要一些东西来跟踪警报的状态。我们可以创建一个符合 Identifiable 的简单结构。并包含我们对警报的不同选择的枚举。
然后我们创建一个 @State跟踪 AlertIdentifier 的变量并初始化为 nil使其状态为空,并且在更改之前不会显示任何警报。
然后我们可以添加我们的 .alert(item:content:)到我们的 View .
这是一个简单的例子,展示了它的作用。
struct ContentView:View {

private struct AlertIdentifier: Identifiable {
var id: Choice

enum Choice {
case success
case failure
}
}

@State private var showAlert: AlertIdentifier? // init this as nil

var body: some View {
VStack(spacing: 20) {
Button(action: {
self.showAlert = AlertIdentifier(id: .success)

}, label: {
Text("Show success alert")
})

Button(action: {
self.showAlert = AlertIdentifier(id: .failure)

}, label: {
Text("Show failure alert")
})
}
.alert(item: $showAlert) { alert -> Alert in

switch alert.id {
case .success:
return Alert(title: Text("Success"), message: Text("You have successfully registered"), dismissButton: .default(Text("OK")))

case .failure:
return Alert(title: Text("Failure"), message: Text("You have failed to register"), dismissButton: .default(Text("OK")))
}
}
}
}
请注意,在按钮中我们设置了 showAlert成为结构 AlertIdentifier 的实例使用我们要显示的警报类型。在这种情况下,我们有两种类型:成功和失败(但我们可以拥有任意数量的类型,我们不需要使用成功和失败的名称)。设置后,它将显示适当的警报。
在我们的 .alert(item:content:)我们切换不同的 id s 这样我们就可以确保为正确的选择显示正确的警报。
这种方法比拥有多个 bool 值要容易得多,并且更容易扩展。
Sheets 和 ActionSheets 的附录 SheetsActionSheetsAlerts 非常相似它们是如何呈现的。有四种方式呈现 Sheets .
这两个需要 Bool捆绑:
.sheet(isPresented: Binding<Bool>, content: () -> View)
.sheet(isPresented: Binding<Bool>, onDismiss: (() -> Void)?, content: () -> Void)
这两个需要 Identifiable捆绑:
.sheet(item: Binding<Identifiable?>, content: (Identifiable) -> View)
.sheet(item: Binding<Identifiable?>, onDismiss: (() -> Void)?, content: (Identifiable) -> View)
对于 ActionSheets有两种方式,如 Alerts .
Bool捆绑:
.actionSheet(isPresented: Binding<Bool>, content: () -> ActionSheet)
Identifiable捆绑:
.actionSheet(item: Binding<Identifiable?>, content: (Identifiable) -> ActionSheet)
我应该使用哪种绑定(bind)?
绑定(bind)< bool >
如果您只需要显示一种 Alert , SheetActionSheet然后使用 Bool绑定(bind),它可以节省您编写一些额外的代码行。
绑定(bind)<可识别?>
如果您有许多不同类型的 Alert年代, Sheet s 或 ActionSheet s 显示然后选择 Identifiable绑定(bind),因为它使管理更容易。

更简单的识别
可识别对象的更简单版本是使用枚举而不将其包装在结构中。在这种情况下,我们需要符合 Identifiable,因此我们需要一个计算属性来存储 id 值。我们还需要确保枚举使用 RawRepresentable,以便我们可以获得唯一的 id 值。我建议使用 Int 或 String。在下面的示例中,我使用的是 Int。
enum Choice: Int, Identifiable {
var id: Int {
rawValue
}

case success, failure
}
然后在 View 中我们可以执行以下操作:
struct ContentView:View {

enum Choice: Int, Identifiable {
var id: Int {
rawValue
}
case success, failure
}

@State private var showAlert: Choice? // init this as nil

var body: some View {
VStack(spacing: 20) {
Button(action: {
self.showAlert = .success

}, label: {
Text("Show success alert")
})

Button(action: {
self.showAlert = .failure

}, label: {
Text("Show failure alert")
})
}
.alert(item: $showAlert) { alert -> Alert in

switch alert {
case .success:
return Alert(title: Text("Success"), message: Text("You have successfully registered"), dismissButton: .default(Text("OK")))

case .failure:
return Alert(title: Text("Failure"), message: Text("You have failed to register"), dismissButton: .default(Text("OK")))
}
}
}
}

关于ios - 单击swiftui中的按钮后如何根据条件显示不同的警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58737767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com