使用iOS13.2、Swift-5.1.2、Xcode-11.2,我尝试如下:
我想用TextField。用户只能在TextField中输入x字数.
我的代码如下:
import Combine
import SwiftUI
class Entry: ObservableObject {
@Published var entry = "" {
didSet {
entry = String(entry.prefix(6)) // trying to limit to 6 characters
}
}
}在上面的代码中,已经有了异常行。
我可以看到didSet{...}是错误的(因为我们一次又一次地在一个没完没了的循环设置/教学设置中结束).
,有什么更好的方法来将TextField限制为x-数量的字符?
下面是代码的其余部分:
struct NumberView: View {
var body: some View {
Group {
HStack {
Spacer()
NumberIcon(number: 1)
NumberIcon(number: 2)
NumberIcon(number: 3)
NumberIcon(number: 4)
NumberIcon(number: 5)
NumberIcon(number: 6)
Spacer()
}
}
}
}struct NumberIcon: View {
@ObservedObject private var entry = Entry()
var number: Int = 0
var body: some View {
TextField(" ", text: $entry.entry, onEditingChanged: { editing in
print(editing)
print(self.$entry)
})
.padding()
.foregroundColor(Color.black)
.background(Color.green)
.font(.largeTitle)
.lineLimit(1)
.cornerRadius(16.0)
.clipped()
.keyboardType(.numberPad)
}
}
struct NumberView_Previews: PreviewProvider {
static var previews: some View {
NumberView()
}
}我知道有可能使用UIKit包装器来使用shouldChangeCharactersIn委托方法表单UITextFieldDelegate,但是我希望完全使用SwiftUI (没有UIKit代码)来实现字符限制。我怎么能这么做?
发布于 2022-02-12 15:04:31
你可以用这个:
.onReceive(variable.publisher.collect()) {
variable = String($0.prefix(4))
}发布于 2019-11-02 16:13:56
多亏了这个答案在这里,我找到了一个解决方案:
可以重写条目类:
class Entry: ObservableObject {
let characterLimit = 6 // limiting to 6 characters
@Published var entry = "" {
didSet {
if entry.count > characterLimit && oldValue.count <= characterLimit {
entry = oldValue
}
}
}
}发布于 2019-11-02 16:34:55
在SwiftUI中实现这一目标的最简单方法是在达到最大字符数时禁用TextField:
struct LimittedTextField: View {
@State private var entry = ""
let characterLimit = 6
var body: some View {
TextField("", text: $entry)
.disabled(entry.count > (characterLimit - 1))
}
}https://stackoverflow.com/questions/58672761
复制相似问题