美文网首页SwiftUI 工具集Hacking with iOS: SwiftUI Edition
SwiftUI:alert() 和 sheet() 与可选值一起

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

作者: 韦弦Zhy | 来源:发表于2021-01-15 18:22 被阅读0次

    \color{red}{\Large \mathbf{Hacking \quad with \quad iOS: SwiftUI \quad Edition}}

    {\Large \mathbf{alert() \ and \ sheet() }}

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

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

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

    struct User: Identifiable {
        var id = "Taylor Swift"
    }
    

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

    @State private var selectedUser: User? = nil
    

    现在,我们可以更改ContentViewbody,以便在点击其文本视图时将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()修饰符中强制展开——如果您可以避免这些事情的话那随你好了。

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

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

    相关文章

      网友评论

        本文标题:SwiftUI:alert() 和 sheet() 与可选值一起

        本文链接:https://www.haomeiwen.com/subject/xxuwaktx.html