如何为 Swift UI 的字符添加最大长度

Posted

技术标签:

【中文标题】如何为 Swift UI 的字符添加最大长度【英文标题】:How to Add Max length for a character for Swift UI 【发布时间】:2019-10-13 09:20:39 【问题描述】:

您好,我正在创建一个待办事项应用程序,当用户在 UIText 字段中输入一些字符时遇到问题,我记得 SWIFT 5 中有一种方法可以设置最大长度,但我在 SWIFT 中找不到UI 有人可以给我发送链接或逐步指导我如何将 MAX LENTGH 添加到文本字段的 SWIFT UI 项目!谢谢

我试图在任何地方找到它,但我找不到

结构NewTaskView:查看 var taskStore: TaskStore

@Environment(\.presentationMode) var presentationMode


@State var text = ""
@State var priority: Task.Priority = .Низкий


var body: some View 
    Form 
        TextField("Название задания", text: $text)


        VStack 
            Text("Приоритет")
                .multilineTextAlignment(.center)
            Picker("Priority", selection: $priority.caseIndex) 
                ForEach(Task.Priority.allCases.indices)  priorityIndex in
                    Text(
                        Task.Priority.allCases[priorityIndex].rawValue
                        .capitalized
                    )
                    .tag(priorityIndex)
                
            
            .pickerStyle( SegmentedPickerStyle() )
        

我想将最大长度放入写入 TextField("Название задания", text: $text) 的文本字段中

【问题讨论】:

【参考方案1】:

这似乎可以通过使用 Combine 来实现,方法是在文本周围创建一个包装器并打开 2 路订阅,其中文本订阅 TextField,TextField 订阅 ObservableObject。从 Reactive 的角度来看,我想说它的工作方式非常合乎逻辑,但我希望找到一个不需要创建另一个对象的更简洁的解决方案。

import SwiftUI
import Combine

class TextBindingManager: ObservableObject 
    @Published var text = "" 
        didSet 
            if text.count > characterLimit && oldValue.count <= characterLimit 
                text = oldValue
            
        
    
    let characterLimit = 5


struct ContentView: View 
    @ObservedObject var textBindingManager = TextBindingManager()

    var body: some View 
        TextField("Placeholder", text: $textBindingManager.text)
    

【讨论】:

这是一个您可以设置的数字,无论是在本地替换为您的限制,还是您要声明为属性:let characterLimit = 4 if text.count &gt; 4 &amp;&amp; oldValue.count &lt;= 4 替换 if 行,它将编译并且应该可以工作。或者,在您的对象中,您可以声明一个常量(请参阅我之前的评论)并使用它进行比较。这将使您可以轻松地重用它,如果您需要多次使用它,可以获得一致的限制,并且在需要时更容易更改和更新,而无需挖掘代码。 我可以通过邮件向您发送我的项目吗?您可以看看吗?对不起,我刚开始学习 Swift UI,我仍然坚持结构和实现代码 对不起,它在我的项目中起作用的原因是我使用EnvironmentObject 来包装字符串。从头开始创建一个项目并获得了一个可行的解决方案,请参阅我编辑的答案。我确实发现 SwiftUI 在一些简单的事情上非常违反直觉。您最终会在复杂问题上节省大量时间,但这与在简单任务上花费比平时更长的时间相平衡 是的,太疯狂了。我现在有 2 个问题,即关闭键盘并在 SWIFT UI 中设置字符的最大长度!这两个文件什么都没有!!!:((【参考方案2】:

我读了这篇文章。请查看here

这是我的全部代码。我不使用EnvironmentObject

struct ContentView: View 
    @ObservedObject private var restrictInput = RestrictInput(5)
    var body: some View 
        Form 
            TextField("input text", text: $restrictInput.text)
        
    

class RestrictInput: ObservableObject 
    @Published var text = ""
    private var canc: AnyCancellable!
    init (_ maxLength: Int) 
        canc = $text
            .debounce(for: 0.5, scheduler: DispatchQueue.main)
            .map  String($0.prefix(maxLength)) 
            .assign(to: \.text, on: self)
    
    deinit 
        canc.cancel()
    

【讨论】:

以上是关于如何为 Swift UI 的字符添加最大长度的主要内容,如果未能解决你的问题,请参考以下文章

如何为文本小部件设置字符的最大宽度?

UITextField 在 Swift 中设置最大字符长度

如何为字符串生成所有可能的(n 长度)子集?

如何为任何输入添加带有快捷方式的特殊字符?

excel 如何为列添加指定内容(字符串)

如何为字符串中的特定单词添加颜色? [复制]