SwiftUI TextField принудительно строчные - PullRequest
1 голос
/ 01 апреля 2020

Я хотел бы использовать специфицированный c TextField для записей URL, где пользователь может вводить только символы нижнего регистра, но я не могу найти никакого модификатора TextField для этой цели. Есть ли решение?

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

если все, что вам нужно, это «завершить» строчной строкой после того, как пользователь нажмет return, вы можете сделать это:

@State var txt: String = ""

var body: some View {
        TextField("", text: $txt, onEditingChanged: { _ in
            self.txt = self.txt.lowercased()
        })
}
1 голос
/ 01 апреля 2020

Вы можете создать пользовательскую привязку и установить переменную URL-адреса своего состояния для строчной версии ввода через нее:

struct ContentView: View {
    @State var url: String = ""

    var body: some View {
        let binding = Binding<String>(get: {
            self.url
        }, set: {
            self.url = $0.lowercased()
        })

        return VStack {
            TextField("Enter URL", text: binding)
        }

    }
}
0 голосов
/ 01 апреля 2020

более сложный, но более гибкий способ, примерно такой:

class LowerCaseStringFormatter: Formatter {

override func string(for obj: Any?) -> String? {
    guard let str = obj as? NSString else { return nil }
    return str.lowercased as String
}

override func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
    obj?.pointee = string.lowercased() as NSString
    return true
}

override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
    return true
}

}

и назовите его так:

 TextField("type something...", value: $txt, formatter: LowerCaseStringFormatter())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...