Ограничьте TextField x количеством символов, используя SwiftUI - PullRequest
0 голосов
/ 02 ноября 2019

Используя iOS13.2, Swift-5.1.2, Xcode-11.2, я пытаюсь сделать следующее:

Я хочу использовать TextField. Пользователь должен иметь возможность только вводить x-количество символов в TextField.

Мой код выглядит следующим образом:

import Combine
import SwiftUI

class Entry: ObservableObject {

  @Published var entry = "" {
    didSet {
        entry = String(entry.prefix(6)) // trying to limit to 6 characters
    }
  }
}

И в приведенном выше коде уже есть строка исключения,

Я вижу, что didSet{...} неправильный (так как мы в конечном итоге в бесконечном цикле настройки / didSetting снова и снова) ...

Какой лучший способограничить 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). Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Самый простой способ добиться этого в SwiftUI - просто отключить TextField при достижении максимального количества символов:

struct LimittedTextField: View {

    @State private var entry = ""

    let characterLimit = 6

    var body: some View {
        TextField("", text: $entry)
            .disabled(entry.count > (characterLimit - 1))
    }
}
0 голосов
/ 02 ноября 2019

Благодаря этому ответу я нашел решение:

Класс Entry можно переписать:

class Entry: ObservableObject {

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