SwiftUI:alert() 和 sheet() 与可选值一起使用

2021-01-18 11:11:04 浏览数 (1)

SwiftUI有两种创建警报和表单的方式,到目前为止,我们仅使用一种方法:绑定到布尔值,该布尔值在变为 true 时显示 Alert 或 Sheet。

第二种方法并不经常使用,但是在您需要的时候它确实有用:您可以使用可选的Identifiable对象作为条件,并且当该对象具有值时将显示 Alert 或Sheet 。它的闭包将为您提供用于条件的非可选值,因此您可以安全地使用它。

为了说明这一点,我们可以创建一个符合Identifiable协议的简易的User结构体:

代码语言:javascript复制
struct User: Identifiable {
    var id = "Taylor Swift"
}

然后,我们可以在ContentView中创建一个属性,以跟踪选择了哪个用户,默认情况下设置为 nil

代码语言:javascript复制
@State private var selectedUser: User? = nil

现在,我们可以更改ContentViewbody,以便在点击其文本视图时将selectedUser设置为一个值,然后再为selectedUser提供值时使用alert(item:)显示警报:

代码语言:javascript复制
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:)修饰符来重写上述代码,它将看起来像这样:

代码语言:javascript复制
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()修饰符中强制展开——如果您可以避免这些事情的话那随你好了。

参考 Alert弹窗 SwiftUI:ActionSheet 弹窗 SwiftUI:Sheet 视图

译自 Using alert() and sheet() with optionals

0 人点赞