Skip to main content

Command Palette

Search for a command to run...

Swift的Binding小纸条

Published
1 min read
Swift的Binding小纸条

我们经常会使用Binding来把一个打通两个View。最常见的一个例子就是Picker:

image.png

自定义Binding

使用Binding实例

如果我们在Picker选择发生变化时想做一些操作,就会发现问题了,因为Picker里不好写.onTapGesture。这时就需要使用自定义Binding变量了。最简单的方法,就是在selection参数处直接定义一个Binding,就像这段代码,一个Binding的实例有了get和set两个匿名函数,你可以完成自己的自定义操作了(联动改变choosed的值)。

import SwiftUI
struct MyContentView : View {
    @State private var choosed = "You selected 1"
    @State var choosed_int = 1

    var body: some View{
        VStack{
            Text("\(choosed)")
            Picker("Please Choose", 
                   selection: Binding(
                    get: { choosed_int }, 
                    set: { 
                        choosed_int = $0 
                        choosed = "You select \($0)"
                    })) { 
                Text("hello 1").tag(1)
                Text("hello 2").tag(2)
                Text("hello 3").tag(3)
            }.frame(width: 100)
        }
    }
}

使用body内的Binding实例

对于在Picker声明时写大段的代码,这确实从代码的可读性上显得不够优雅。所以我们可以在body里声明一个Binding的实例来优雅的完成这段代码:

import SwiftUI
struct MyContentView : View {
    @State private var choosed = "You selected 1"
    @State var choosed_int = 1

    var body: some View{
        let binding = Binding(
            get: { choosed_int }, 
            set: { 
                choosed_int = $0 
                choosed = "You select \($0)"
            })
        return VStack{
            Text("\(choosed)")
            Picker("Please Choose", 
                   selection: binding ) { 
                Text("hello 1").tag(1)
                Text("hello 2").tag(2)
                Text("hello 3").tag(3)
            }.frame(width: 100)
        }
    }
}

对View的Binding属性进行自定义

如果对一个已经使用Binding声明的属性,想做自定义的getter和setter也是一个非常方便的事:

struct MyContentView : View {
    @State private var choosed = "You selected 1"
    @Binding var value:Int
    var choosed_int : Binding<Int>{
        Binding<Int>(
            get: { 
                return self.value 
            }, 
            set: { 
                self.value = $0 
                choosed = "You select \($0)"
            }
        )
    }

    var body: some View{
        VStack{
            Text("\(choosed)")
            Picker("Please Choose", 
                   selection: choosed_int ) { 
                Text("hello 1").tag(1)
                Text("hello 2").tag(2)
                Text("hello 3").tag(3)
            }.frame(width: 100)
        }
    }
}

More from this blog

Https 本地服务器小纸条

最近想要尝试一下Telegram mini app,在调试时需要使用https的服务。试来试去发现在Mac下完成一个简单的HTTPS服务器还是需要点奇奇怪怪的工具的。但是整体来讲非常简单。 准备证书 主要会使用mkcert来创建证书。首先安装mkcert。 brew install mkcert brew install nss # if use Firefox 将mkcert加入到本地root CA。 mkcert -install 生成证书 本地调试可以使用localhost或127.0...

Feb 21, 20241 min read
Https 本地服务器小纸条

macOS中使用Docker发布一个python项目的小纸条

最近写了一个Telegram Bot,它可以使用语音和文字与GPT进行交互,成为了我日常重度使用的工具。从练习英语的听说读,到日常的搜索使用上都让我有了不少收获。终于,日常跑在我笔记本上的日子就要过去了,我需要它能日常跑在我的服务器上,所以准备使用Docker整个image,使得我日常的更新和服务器的迁移更为简单些。所以写下这个小纸条,方便以后自己回来查看。 安装Docker 使用Homebrew安装简单方便: brew install --cask docker Homebrew会视你的机器...

Mar 10, 20233 min read
macOS中使用Docker发布一个python项目的小纸条

老房东的纸条箱

39 posts