首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在编辑另一个TextField时更改TextField

在编辑另一个TextField时更改TextField
EN

Stack Overflow用户
提问于 2021-06-27 14:03:41
回答 1查看 66关注 0票数 0

我最近开始学习SwiftUI,我想做一个单位转换器。在这个过程中,我遇到了一个问题:必须确保当将一个数值输入其中一个TextField时,会触发其余的TextField公式,并显示总值。

代码语言:javascript
运行
AI代码解释
复制
import SwiftUI
import Combine

struct ContentView: View {
    @State var celsius: String = ""
    @State var kelvin: String = ""
    @State var farenheit: String = ""
    @State var reyumur: String = ""
    @State var rankin: String = ""
    var body: some View {
        NavigationView {
            Temperature(celsius: $celsius, kelvin: $kelvin, farenheit: $farenheit, reyumur: $reyumur, rankin: $rankin)
        }
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct Temperature: View {
    @Binding var celsius: String
    @Binding var kelvin: String
    @Binding var farenheit: String
    @Binding var reyumur: String
    @Binding var rankin: String
    var body: some View {
        List {
            Section(
                header: Text("Международная система (СИ)")) {
                HStack {
                    TextField("Enter value", text: $celsius)
                        .keyboardType(.numbersAndPunctuation)
                        .onReceive(Just(celsius)) { newValue in
                            let filtered = newValue.filter { "0123456789.".contains($0) }
                            if filtered != newValue {
                                self.celsius = filtered
                            }
                        }
                    Text("°C")
                        .padding(.horizontal)
                        .font(.headline)
                        .foregroundColor(.blue)
                }
                HStack {
                    TextField("Enter value", text: $kelvin)
                        .keyboardType(.numbersAndPunctuation)
                        .onReceive(Just(kelvin)) { newValue in
                            let filtered = newValue.filter { "0123456789.".contains($0) }
                            if filtered != newValue {
                                self.kelvin = filtered
                            }
                        }
                    Text("K")
                        .padding(.horizontal)
                        .font(.headline)
                        .foregroundColor(.blue)
                }
            }
            Section(
                header: Text("США и Британия")) {
                HStack {
                    TextField("Enter value" , text: $farenheit)
                        .keyboardType(.numbersAndPunctuation)
                        .onReceive(Just(farenheit)) { newValue in
                            let filtered = newValue.filter { "0123456789.".contains($0) }
                            if filtered != newValue {
                                self.farenheit = filtered
                            }
                        }
                    Text("F")
                        .padding(.horizontal)
                        .font(.headline)
                        .foregroundColor(.blue)
                }
            }
            Section(
                header: Text("Редкоиспользуемые")) {
                HStack {
                    TextField("Enter value" , text: $reyumur)
                        .keyboardType(.numbersAndPunctuation)
                        .onReceive(Just(reyumur)) { newValue in
                            let filtered = newValue.filter { "0123456789.".contains($0) }
                            if filtered != newValue {
                                self.reyumur = filtered
                            }
                        }
                    Text("Re")
                        .padding(.horizontal)
                        .font(.headline)
                        .foregroundColor(.blue)
                }
                HStack {
                    TextField("Enter value" , text: $rankin)
                        .keyboardType(.numbersAndPunctuation)
                        .onReceive(Just(rankin)) { newValue in
                            let filtered = newValue.filter { "0123456789.".contains($0) }
                            if filtered != newValue {
                                self.rankin = filtered
                            }
                        }
                    Text("R")
                        .padding(.horizontal)
                        .font(.headline)
                        .foregroundColor(.blue)
                }
            }
        }
        .navigationBarTitle("Temperature")
        .navigationBarTitleDisplayMode(.inline)
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-06-27 16:52:27

在SwiftUI 3中,@FocusState可以用来检测TextField是否被聚焦,这使得可以根据它的值执行不同的工作。您可以将一个变量设置为主变量,并从中计算其他值。对于每个值,使用两个函数进行正向和反向计算:

代码语言:javascript
运行
AI代码解释
复制
struct CelsiusAndKelvin: View {
    @State private var celsius: String = ""  // Assume all other values are based on celsius
    
    @FocusState private var isKelvinFocused: Bool  // When focused,
    @State private var kelvinWhenFocused: String?  // you may not want it to be calculated from other values
    private var kelvinMask: Binding<String> {
        Binding {  // If `isKelvinFocused` turns true, this getter will be called first
            if isKelvinFocused && kelvinWhenFocused != nil {
                return kelvinWhenFocused!
            }
            
            if let x = Double(celsius) {
                return String(format: "%.2f", c2k(x))
            }
            
            return ""
        } set: {
            if isKelvinFocused { kelvinWhenFocused = $0 }
            
            if let x = Double($0) {
                celsius = String(format: "%.2f", k2c(x))
            } else {
                celsius = ""
            }
        }
    }
    
    var body: some View {
        Form {
            TextField("°C", text: $celsius)
            TextField("K", text: kelvinMask)
                .focused($isKelvinFocused)
        }
        .onChange(of: isKelvinFocused) {
            // Make `isKelvinFocused` always equal to `kelvinWhenFocused != nil`
            if !$0 { kelvinWhenFocused = nil }
        }
    }
}

extension CelsiusAndKelvin {
    private func c2k(_ x: Double) -> Double {
        return x + 273.15
    }
    
    private func k2c(_ x: Double) -> Double {
        return x - 273.15
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68151960

复制
相关文章
急性睡眠剥夺和慢性睡眠限制后个体调制睡眠稳态的压力增长
瑞士苏黎世大学的MaricAngelina、Huber Reto等人在Sleep杂志上发表了一项研究,用来解释急性睡眠剥夺、慢性睡眠限制对大脑的神经活动的影响及其与神经行为损伤的关系。 现代社会普遍存在慢性睡眠缺失的现象,每个人在睡眠缺失后表现出不同的症状,瑞士苏黎世医院大学的研究者,发现急性睡眠剥夺(ASD, acute sleep deprivation)和慢性睡眠限制(CSR, chronic sleep restriction)的慢波增长的程度在个体间的差异,并以此推测其与缺眠群体的认知功能损伤的关
用户1279583
2018/04/08
1.8K0
急性睡眠剥夺和慢性睡眠限制后个体调制睡眠稳态的压力增长
JS写睡眠排序
就是说当前数字是多少,就在多少*100毫秒后添加到result数组。不过从这个例子里也能小小练习一下Promise的用法。
kifuan
2022/10/24
10.7K0
先有大脑,还是先有睡眠?ScienceAdvances解密:睡眠先于大脑进化
---- 新智元报道   来源:外媒 编辑:LQ 【新智元导读】动物是从什么时候开始需要睡眠的?大脑是产生睡眠的前提吗?ScienceAdvances解密:原来睡眠比大脑出现的还要早。 水螅,又名九头蛇,是一种简单的生物。 身长不到半英寸,管状的身体一端有一只脚,另一端有一个嘴。 脚紧贴在水面上,也许是植物或岩石上面,嘴巴周围是触须,它会诱捕经过的水蚤。 水螅没有大脑,甚至连神经系统都没有。 新的研究表明,它会睡觉。 韩国和日本的一个研究小组的研究表明,水螅会周期性地进入休息状态,这一状态符合睡眠的
新智元
2023/05/22
4300
先有大脑,还是先有睡眠?ScienceAdvances解密:睡眠先于大脑进化
EEG与睡眠分期
睡眠定义为一种无意识状态(unconsciousness) ¨1937年美国学者Loomis首次提出用EEG方法取代行为学作为睡眠深度判断的标准。1953年美国Aserinsky和Kleitman发现REM现象。1968年Rechtchaffen和Kales提出睡眠分期的标准,并由美国生理协会推荐为第一个睡眠分期的国际分类。
脑机接口社区
2020/07/01
2.4K0
EEG与睡眠分期
关于睡眠和休眠
到底用睡眠和休眠,还是直接关机的问题,争论颇多,大家各有各的观点和立场。实际上在很长一段时间内我本人的态度也是变化了不少,在此我想说说我对这个问题的看法,简要分析一下可能涉及到的几个方面。这只是我个人的观点,欢迎大家发表不同意见,但回帖前请先完整的看完本帖的内容。 我首先给出结论,我认为:在大部分情况下使用睡眠和休眠就可以了,重启和关机是在极少数情况下使用的,比如安装了新软件要求重启,或者系统出现了严重故障。下面从几个方面来说这个问题,这里默认了一个前提,就是你的主板支持 s3 待机。究竟哪些主板支持?我家有台老爷机, 2001 年买的,它都支持,我想不必再多说些什么了吧,有的主板需要在 bios 里开启后才支持。还有一种判定方法,就是在设备管理器的系统设备里,看看有没有个叫 "ACPI-Compliant System" 的东西,如果有的话就说明高级电源管理接口已经启动,即支持 s3 待机。
williamwong
2018/07/24
2.8K0
关于睡眠和休眠
typescript 接口_typeScript
TypeScript 的核心原则之一是对值所具有的结构进行类型检查。我们使用接口(Interfaces)来定义对象的类型。接口是对象的状态(属性)和行为(方法)的抽象(描述)
全栈程序员站长
2022/09/16
1.1K0
typescript 接口_typeScript
这项研究对慢波睡眠最能解释深度睡眠的理论提出了挑战
洛桑大学医院的一组研究人员的研究结果,挑战了睡眠期间脑电波缓慢表明人感觉自己处于深度睡眠状态的理论。他们的研究结果发表在《Current Biology》杂志上。
脑机接口社区
2022/08/18
6510
这项研究对慢波睡眠最能解释深度睡眠的理论提出了挑战
Typescript教程_安装typescript
由于最近在使用vue3写项目,使用vue3的前提就是要学习TypeScript,TypeScript算是JavaScript的升级版,TypeScript包含JavaScript和自己的一些特性
全栈程序员站长
2022/09/19
8290
TypeScript系列 - 什么是TypeScript
看了很多关于TypeScript的文章,总体说来没有很好的,一个系统的学习TypeScript的资源。
Hongten
2019/02/25
1.1K0
TypeScript系列 - 什么是TypeScript
typescript web_typescript文档
上一篇我们讲到如何手动编译TypeScript,如果我们每次都要手动编译,那么这样会很累,接下来就介绍自动编译TypeScript。
全栈程序员站长
2022/09/19
1.2K0
typescript web_typescript文档
TypeScript
TypeScript中的Object类型并不单指普通的对象类型,而是泛指非原始类型,也就是对象,数组和函数
conanma
2021/10/28
1.8K0
响铃:三星、诺基亚、苹果等巨头涌进睡眠监测赛道,“世界睡眠日”会被终结吗?
每年的3月21日是世界睡眠日。尽管充足的睡眠是国际社会公认的三项健康标准之一,但全球人类的睡眠问题却越来越严重了。根据世界卫生组织的调查显示,全球27%的人有睡眠问题,其中中国为38%,法国为30%,美国高达41%。
曾响铃
2018/08/21
7350
响铃:三星、诺基亚、苹果等巨头涌进睡眠监测赛道,“世界睡眠日”会被终结吗?
TypeScript简介_TypeScript笔记1
TypeScript 最初是个微软内部项目,叫 Strada,致力于提升大型 JS 项目(当时内部需求是 Bing Maps、 Office Web Apps 甚至 Windows 8 apps)的可靠性和可维护性。2010 年开始开发,2012 年 10 月发布了第一个开源版本,持续迭代至今
ayqy贾杰
2019/06/12
1.3K0
javascript typescript_typescript python
前言:无论在学习什么语言的时候,我们都需要明白其该怎么样去定义一个变量或者Function,那么今天我们来看看TypeScript的数据类型。
全栈程序员站长
2022/09/24
5860
javascript typescript_typescript python
typescript [接口]
如type str=string就是自定义一个str类型(将字符串类型赋给了它),
用户4793865
2023/01/12
3530
typescript [接口]
TypeScript
https://www.runoob.com/w3cnote/getting-started-with-typescript.html
P轴
2022/11/18
5250
TypeScript
接口(interface)可以用于对【对象的形状(Shape)】进行描述,当然也可以使用interface 描述 class
九旬
2020/10/23
1.8K0
TypeScript
typescript
TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。
一粒小麦
2019/07/18
2K0
typescript
TypeScript
TypeScript 是JavaScript类型的超集,它可以编译成纯JavaScript。
余生
2018/12/07
7090
TypeScript
lib用于指定要包含在编译中的库文件 “lib”:[ “es6”, “dom” ],
jinghong
2020/05/12
1.4K0

相似问题

为什么“睡眠99999999 &睡眠10 &睡眠15”不是永远的睡眠?

20

php睡眠与bash睡眠

38

cucumber-protactor-typescript通过css设置睡眠和元素的正确方法

111

用纳米睡眠()随机睡眠

12

唤醒睡眠线程--中断()与将睡眠“分割”成多个睡眠

34
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文