SwiftUI之如何创建常量绑定与自定义绑定

举报
Serendipity·y 发表于 2022/02/16 23:52:25 2022/02/16
【摘要】 一、如何创建常量绑定? 当正在制作一些 UI 原型时,或者当只需要传入一个值来让 SwiftUI 预览显示一些有意义的东西时,可以会发现使用常量绑定很有帮助:硬编码的值不会改变,但可以仍然像常规绑定一样...

一、如何创建常量绑定?

  • 当正在制作一些 UI 原型时,或者当只需要传入一个值来让 SwiftUI 预览显示一些有意义的东西时,可以会发现使用常量绑定很有帮助:硬编码的值不会改变,但可以仍然像常规绑定一样使用,因此我们的代码可以正常工作。
  • 例如,如果想创建一个切换开关,通常必须创建一个@State 属性来存储布尔值,然后在创建它时将其发送到切换开关中;但是,如果只是为用户界面设计原型,则可以改用常量绑定,如下所示:
Toggle(isOn: .constant(true)) {
    Text("Show advanced options")
}

  
 
  • 效果如下:

在这里插入图片描述

  • 该开关是只读的并且始终处于开启状态,因为这就是我们的常量绑定所说的,但现在足以让您动起来,可以稍后返回并用完整的 @State 属性替换它。这些常量绑定有各种类型:布尔值、字符串、整数等都可用,Swift 将确保为每种视图类型使用正确的绑定。

二、如何创建自定义绑定?

  • 当使用 SwiftUI 的 @State 属性包装器时,它为我们做了大量的工作来允许用户界面控件的双向绑定。 但是,我们也可以使用 Binding 类型手动创建绑定,它可以提供自定义的 get 和 set 闭包,以便在读取或写入值时运行。
  • 例如,创建一个简单的绑定,它只是作为另一个属性的传递:
struct ContentView: View {
    @State private var username = ""

    var body: some View {
        let binding = Binding(
            get: { self.username },
            set: { self.username = $0 }
        )

        return VStack {
            TextField("Enter your name", text: binding)
        }
    }
}

  
 
  • 当绑定到自定义 Binding 实例时,不需要在绑定名称前使用 $ 符号,因为已经阅读了双向绑定。
  • 当想为正在读取或写入的绑定添加额外的逻辑时,自定义绑定非常有用,我们可能希望在将值发回之前执行一些计算,或者可能希望在值更改时采取一些额外的操作。例如,可以创建一个由两个切换开关组成的堆栈,其中两个开关都可以关闭,一个可以打开,但不能同时打开,启用一个将始终禁用另一个,如下所示:
struct ContentView: View {
    @State private var firstToggle = false
    @State private var secondToggle = false

    var body: some View {
        let firstBinding = Binding(
            get: { self.firstToggle },
            set: {
                self.firstToggle = $0

                if $0 == true {
                    self.secondToggle = false
                }
            }
        )

        let secondBinding = Binding(
            get: { self.secondToggle },
            set: {
                self.secondToggle = $0

                if $0 == true {
                    self.firstToggle = false
                }
            }
        )

        return VStack {
            Toggle(isOn: firstBinding) {
                Text("First toggle")
            }

            Toggle(isOn: secondBinding) {
                Text("Second toggle")
            }
        }
    }
}

  
 

在这里插入图片描述

文章来源: blog.csdn.net,作者:Serendipity·y,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Forever_wj/article/details/121983620

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。