gpt4 book ai didi

swiftui - 如何创建只接受数字的文本字段

转载 作者:行者123 更新时间:2023-12-02 19:02:30 53 4
gpt4 key购买 nike

我是 SwiftUI 和 iOS 新手,我正在尝试创建一个仅接受数字的输入字段。

 TextField("Total number of people", text: $numOfPeople)

TextField 目前允许输入字母字符,如何才能让用户只能输入数字?

最佳答案

虽然显示数字键盘是一个很好的第一步,但它实际上并不能防止输入错误数据:

  1. 用户可以将非数字文本粘贴到 TextField
  2. iPad 用户仍将获得全键盘
  3. 任何连接蓝牙键盘的人都可以输入任何内容

您真正想做的是清理输入,如下所示:

import SwiftUI
import Combine

struct StackOverflowTests: View {
@State private var numOfPeople = "0"

var body: some View {
TextField("Total number of people", text: $numOfPeople)
.keyboardType(.numberPad)
.onReceive(Just(numOfPeople)) { newValue in
let filtered = newValue.filter { "0123456789".contains($0) }
if filtered != newValue {
self.numOfPeople = filtered
}
}
}
}

每当numOfPeople发生变化时,非数字值就会被过滤掉,并且比较过滤后的值,看看是否应该再次更新numOfPeople,覆盖坏的值使用过滤后的输入进行输入。

请注意,Just 发布者要求您导入合并

编辑:

为了解释 Just 发布者,请考虑以下概念性概述,了解更改 TextField 中的值时会发生的情况:

  1. 因为当字段内容发生更改时,TextFieldBinding 绑定(bind)到 String,因此它还会将更改写入 @State变量。
  2. 当标记为 @State 的变量发生更改时,SwiftUI 会重新计算 View 的 body 属性。
  3. body 计算期间,会创建一个 Just 发布者。组合有许多不同的发布者随着时间的推移发出值,但 Just 发布者“仅”获取单个值(numberOfPeople 的新值)并在询问时发出它.
  4. onReceive 方法使 View 成为发布者的订阅者,在本例中是我们刚刚创建的 Just 发布者。订阅后,它会立即向发布者请求任何可用的值,其中只有一个,即 numberOfPeople 的新值。
  5. onReceive订阅者收到一个值时,它会执行指定的闭包。我们的关闭可以通过以下两种方式之一结束。如果文本已经只是数字,那么它什么也不做。如果过滤后的文本不同,则会将其写入 @State 变量,这会再次开始循环,但这次闭包将在不修改任何属性的情况下执行。

查看 Using Combine 了解更多信息。

关于swiftui - 如何创建只接受数字的文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58733003/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com