SwiftUI有两种创建警报和表单的方式,到目前为止,我们仅使用一种方法:绑定到布尔值,该布尔值在变为 true 时显示 Alert 或 Sheet。
第二种方法并不经常使用,但是在您需要的时候它确实有用:您可以使用可选的Identifiable
对象作为条件,并且当该对象具有值时将显示 Alert 或Sheet 。它的闭包将为您提供用于条件的非可选值,因此您可以安全地使用它。
为了说明这一点,我们可以创建一个符合Identifiable
协议的简易的User
结构体:
struct User: Identifiable {
var id = "Taylor Swift"
}
然后,我们可以在ContentView
中创建一个属性,以跟踪选择了哪个用户,默认情况下设置为 nil
:
@State private var selectedUser: User? = nil
现在,我们可以更改ContentView
的body
,以便在点击其文本视图时将selectedUser
设置为一个值,然后再为selectedUser
提供值时使用alert(item:)
显示警报:
Text("Hello, World!")
.onTapGesture {
self.selectedUser = User()
}
.alert(item: $selectedUser) { user in
Alert(title: Text(user.id))
}
使用该简单代码,每当您点击“ Hello,World!”出现提示“Taylor Swift”的警报。解除警报后,SwiftUI会将selectedUser
设置为nil
。
这似乎是一个简单的功能,但是比其他功能更简单,更安全。如果我们要使用旧的.alert(isPresente:)
修饰符来重写上述代码,它将看起来像这样:
struct ContentView: View {
@State private var selectedUser: User? = nil
@State private var isShowingAlert = false
var body: some View {
Text("Hello, World!")
.onTapGesture {
self.selectedUser = User()
self.isShowingAlert = true
}
.alert(isPresented: $isShowingAlert) {
Alert(title: Text(selectedUser!.id))
}
}
}
那是另一个属性,在onTapGesture()
中设置另一个值,并在alert()
修饰符中强制展开——如果您可以避免这些事情的话那随你好了。
网友评论