首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TextField限制SwiftUI的字符数为x

使用TextField限制SwiftUI的字符数为x
EN

Stack Overflow用户
提问于 2019-11-02 16:00:03
回答 4查看 6.3K关注 0票数 3

使用iOS13.2、Swift-5.1.2、Xcode-11.2,我尝试如下:

我想用TextField。用户只能在TextField中输入x字数.

我的代码如下:

代码语言:javascript
复制
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-数量的字符?

下面是代码的其余部分:

代码语言:javascript
复制
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()
            }
         }
    }
}
代码语言:javascript
复制
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代码)来实现字符限制。我怎么能这么做?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-02-12 15:04:31

你可以用这个:

代码语言:javascript
复制
.onReceive(variable.publisher.collect()) {
        variable = String($0.prefix(4))
}
票数 2
EN

Stack Overflow用户

发布于 2019-11-02 16:13:56

多亏了这个答案在这里,我找到了一个解决方案:

可以重写条目类:

代码语言:javascript
复制
class Entry: ObservableObject {

    let characterLimit = 6   // limiting to 6 characters
    @Published var entry = "" {
        didSet {
            if entry.count > characterLimit && oldValue.count <= characterLimit {
                entry = oldValue
            }
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2019-11-02 16:34:55

在SwiftUI中实现这一目标的最简单方法是在达到最大字符数时禁用TextField:

代码语言:javascript
复制
struct LimittedTextField: View {

    @State private var entry = ""

    let characterLimit = 6

    var body: some View {
        TextField("", text: $entry)
            .disabled(entry.count > (characterLimit - 1))
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58672761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档