Как добавить максимальную длину символа для Swift UI - PullRequest
0 голосов
/ 13 октября 2019

Привет, я создаю приложение to do, и я столкнулся с проблемой, когда пользователь вводит некоторые символы в поле UIText. Я помню, что в SWIFT 5 был способ задать максимальную длину, но я не могу найти его в SWIFT. Пользователь может отправить мне ссылку или направить меня шаг за шагом, КАК МОЖНО ДОБАВИТЬ МАКСИМАЛЬНУЮ ДЛИНУ К ПРОЕКТУ SWIFT UI В ТЕКСТОВОМ ПОЛЕ! СПАСИБО

Я пытался найти его везде, но я не могу

struct 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)

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Я прочитал эту статью. пожалуйста, отметьте здесь

Это весь мой код. Я не использую 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()
    }
}
0 голосов
/ 13 октября 2019

Похоже, что этого можно достичь с помощью Combine, создав обертку вокруг текста и открыв двустороннюю подписку с текстом, подписывающимся на TextField, и TextField, подписывающимся на ObservableObject. Я бы сказал, что это работает вполне логично с реактивной точки зрения, но хотелось бы найти более чистое решение, не требующее создания другого объекта.

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)
    }
}
...