【问题标题】:Code for textfield character limit isn't working(SwiftUI)文本字段字符限制代码不起作用(SwiftUI)
【发布时间】:2020-10-23 14:32:20
【问题描述】:

我偶然发现了这段代码:

class TextLimiter: ObservableObject {
private let limit: Int

init(limit: Int) {
    self.limit = limit
}

@Published var value = "" {
    didSet {
        if value.count > self.limit {
            value = String(value.prefix(self.limit))
            self.hasReachedLimit = true
        } else {
            self.hasReachedLimit = false
        }
    }
}

@Published var hasReachedLimit = false }

struct Strix: View {
@ObservedObject var input = TextLimiter(limit: 5)
var body: some View {
    TextField("Text Input",
        text: $input.value)
            .border(Color.red,
                   width: $input.hasReachedLimit.wrappedValue ? 1 : 0 )
   } }

这是一个TextField限制代码,当用户在限制后输入字符后,它不会继续在框内输入字符。我试过这段代码,达到限制后,它只是继续输入字符。

例如:

它应该如何工作:限制是 5,所以唯一允许的输入是 'aaaaa'

它的行为方式:限制为 5,但允许的输入是 'aaaaaaaa.....'

我知道最近有一个解决方案:

How to set textfield character limit SwiftUI?

但该解决方案是专门为 iOS 14 量身定制的。我希望能够支持 iOS 13。谢谢。

原始代码链接:

https://github.com/programmingwithswift/SwiftUITextFieldLimit/blob/master/SwiftUITextFieldLimit/SwiftUITextFieldLimit/ContentView.swift

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    您的解决方案在于 SwiftUI 的订阅者.onReceive

    请确保您的属性hasReachedLimit 不得标有@Published,否则将触发视图主体渲染的无限循环。

    下面显示的代码符合您的预期。

    class TextLimiter: ObservableObject {
        let limit: Int
        @Published var value = ""
        var hasReachedLimit = false
            
        init(limit: Int) {
            self.limit = limit
        }
    }
    
    struct Strix: View {
        @ObservedObject var input = TextLimiter(limit: 5)
        var body: some View {
            TextField("Text Input",
                      text: $input.value)
                .border(Color.red,
                        width: $input.hasReachedLimit.wrappedValue ? 1 : 0 )
                .onReceive(Just(self.input.value)) { inputValue in
                    
                    self.input.hasReachedLimit = inputValue.count > self.input.limit
                    
                    if inputValue.count > self.input.limit {
                        self.input.value.removeLast()
                    }
                }
        }
    }
    

    顺便说一句,这不是一个有效的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 1970-01-01
      • 2015-08-24
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多