问题
I can't seem to find any information or figure out how to set the keyboard type on a TextField for SwiftUI. It would also be nice to be able to enable the secure text property, to hide passwords etc.
This post shows how to "wrap" a UITextField, but I'd rather not use any UI-controls if I don't have to. How to make TextField become first responder?
Anyone have any ideas how this can be done without wrapping an old school UI control?
回答1:
To create a field where you can enter secure text you can use SecureField($password)
https://developer.apple.com/documentation/swiftui/securefield
If you want to set the contentType
of an textField to eg. .oneTimeCode
you can do it like this. Also works with keyboardType
TextField($code)
.textContentType(.oneTimeCode)
.keyboardType(.numberPad)
回答2:
We no longer need to use hacks. Beta 5 has brought a new modifier to set the keyboard type. For example, to use a number pad:
.keyboardType(.numberPad)
There's also autocapitalization()
and an EnvironmentValue disableAutocorrection
.
回答3:
The following wraps a UITextField class called UIKitTextField using UIViewRepresentable. The keyboard type is set to .decimalPad but could be set to any valid keyboard type.
// UIKitTextField.swift
import UIKit
class UIKitTextField: UITextField, UITextFieldDelegate {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
delegate = self
}
required override init(frame: CGRect) {
super.init(frame: frame)
delegate = self
self.setContentHuggingPriority(.defaultHigh, for: .vertical)
}
}
In the ContentView.Swift I created two TextFields. The first is the wrapped UIKit UITextField and the second is the SwiftUI TextField. The data binding is the same so each will display the same text as it is entered.
// ContentView.Swift
import SwiftUI
import UIKit
struct MyTextField : UIViewRepresentable {
@Binding var myText: String
func makeCoordinator() -> MyTextField.Coordinator {
return Coordinator(text: $myText)
}
class Coordinator: NSObject {
@Binding var text: String
init(text: Binding<String>) {
$text = text
}
@objc func textFieldEditingChanged(_ sender: UIKitTextField) {
self.text = sender.text ?? ""
}
}
func makeUIView(context: Context) -> UIKitTextField {
let myTextField = UIKitTextField(frame: .zero)
myTextField.addTarget(context.coordinator, action: #selector(Coordinator.textFieldEditingChanged(_:)), for: .editingChanged)
myTextField.text = self.myText
myTextField.placeholder = "placeholder"
myTextField.borderStyle = .roundedRect
myTextField.keyboardType = .decimalPad
return myTextField
}
func updateUIView(_ uiView: UIKitTextField,
context: Context) {
uiView.text = self.myText
}
}
struct MyTextFieldView: View {
@State var myText: String = "Test"
var body: some View {
VStack {
MyTextField(myText: $myText)
.padding()
TextField($myText)
.textFieldStyle(.roundedBorder)
.padding()
}
}
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
Group{
MyTextFieldView().previewLayout(.sizeThatFits)
MyTextFieldView().previewDevice("iPhone Xs")
}
}
}
#endif
回答4:
Set .keyboardType(.numberPad)
on the TextField. Simple!
回答5:
I'm the dev that answered that post - there's no official way to do so at the moment. Your best bet at the moment is to wrap UITextField – Matteo Pacini
That sums it up, guess we are stuck with wrapping UITextField for now.
回答6:
To set TextField's
keyboard type you need to add modifier .keyboardType()
.
TextField(placeHolder, text: your text)
.keyboardType(.numberPad)
来源:https://stackoverflow.com/questions/56517515/how-to-set-keyboard-type-of-textfield-in-swiftui