SwiftUIのTextFieldでキーボードタイプを設定する方法や情報を見つけられないようです。セキュリティで保護されたテキストプロパティを有効にしたり、パスワードを非表示にしたりすることもできます。
この投稿では、UITextFieldを「ラップ」する方法を示しますが、必要がない場合は、UIコントロールを使用しません。 TextFieldをファーストレスポンダーにする方法
古い学校のUIコントロールをラップせずにこれをどのように行うことができるか、誰かが何かアイデアを持っていますか?
安全なテキストを入力できるフィールドを作成するには、SecureField($password)
を使用できます
https://developer.Apple.com/documentation/swiftui/securefield
たとえば、textFieldのcontentType
を設定したい場合。 .oneTimeCode
このようにできます。 keyboardType
でも動作します
TextField($code)
.textContentType(.oneTimeCode)
.keyboardType(.numberPad)
ハックを使用する必要がなくなりました。 Beta 5では、キーボードタイプを設定するための新しいモディファイヤが導入されました。たとえば、テンキーを使用するには:
_.keyboardType(.numberPad)
_
autocapitalization()
とEnvironmentValue disableAutocorrection
もあります。
TextFieldに.keyboardType(.numberPad)
を設定します。シンプル!
以下は、UITextField
を使用して、UIKitTextField
というUIViewRepresentable
クラスをラップします。キーボードタイプは.decimalPad
に設定されていますが、任意の有効なキーボードタイプに設定できます。
// 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)
}
}
ContentView.Swift
で、2つのTextFields
を作成しました。 1つ目はラップされたUIKit
UITextField
で、2つ目はSwiftUI TextField
です。データバインディングは同じであるため、入力したとおりに同じテキストが表示されます。
// 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
_TextField's
_キーボードタイプを設定するには、修飾子.keyboardType()
を追加する必要があります。
_TextField(placeHolder, text: your text)
.keyboardType(.numberPad)
_
これは私にとってはうまくいきます:
import UIKit
import SwiftUI
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)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
resignFirstResponder()
return true
}
}
struct UBSTextField : UIViewRepresentable {
@Binding var myText: String
let placeHolderText: String
func makeCoordinator() -> UBSTextField.Coordinator {
return Coordinator(text: $myText)
}
class Coordinator: NSObject {
var textBinding: Binding<String>
init(text: Binding<String>) {
self.textBinding = text
}
@objc func textFieldEditingChanged(_ sender: UIKitTextField) {
self.textBinding.wrappedValue = sender.text ?? ""
}
}
func makeUIView(context: Context) -> UIKitTextField {
let textField = UIKitTextField(frame: .zero)
textField.addTarget(context.coordinator, action: #selector(Coordinator.textFieldEditingChanged(_:)), for: .editingChanged)
textField.text = self.myText
textField.placeholder = self.placeHolderText
textField.borderStyle = .none
textField.keyboardType = .asciiCapable
textField.returnKeyType = .done
textField.autocapitalizationType = .words
textField.clearButtonMode = .whileEditing
return textField
}
func updateUIView(_ uiView: UIKitTextField,
context: Context) {
uiView.text = self.myText
}
}
私はその投稿に答えた開発者です-現在のところそれを行う公式の方法はありません。現時点で最善の策は、UITextFieldをラップすることです– Matteo Pacini
要約すると、今のところUITextFieldのラップに悩まされていると思います。