web-dev-qa-db-ja.com

SwiftUIでTextFieldのキーボードタイプを設定する方法

SwiftUIのTextFieldでキーボードタイプを設定する方法や情報を見つけられないようです。セキュリティで保護されたテキストプロパティを有効にしたり、パスワードを非表示にしたりすることもできます。

この投稿では、UITextFieldを「ラップ」する方法を示しますが、必要がない場合は、UIコントロールを使用しません。 TextFieldをファーストレスポンダーにする方法

古い学校のUIコントロールをラップせずにこれをどのように行うことができるか、誰かが何かアイデアを持っていますか?

19
Aaron Bertsch

安全なテキストを入力できるフィールドを作成するには、SecureField($password)を使用できます

https://developer.Apple.com/documentation/swiftui/securefield

たとえば、textFieldのcontentTypeを設定したい場合。 .oneTimeCodeこのようにできます。 keyboardTypeでも動作します

TextField($code)
    .textContentType(.oneTimeCode)
    .keyboardType(.numberPad)
28
Viktor Gardart

ハックを使用する必要がなくなりました。 Beta 5では、キーボードタイプを設定するための新しいモディファイヤが導入されました。たとえば、テンキーを使用するには:

_.keyboardType(.numberPad)
_

autocapitalization()とEnvironmentValue disableAutocorrectionもあります。

12
kontiki

TextFieldに.keyboardType(.numberPad)を設定します。シンプル!

1
Tejas

以下は、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つ目はラップされたUIKitUITextFieldで、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
1
dwitt

_TextField's_キーボードタイプを設定するには、修飾子.keyboardType()を追加する必要があります。

_TextField(placeHolder, text: your text)
    .keyboardType(.numberPad)
_
0
Rohit Makwana

これは私にとってはうまくいきます:

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
    }
}
0
jeffbailey

私はその投稿に答えた開発者です-現在のところそれを行う公式の方法はありません。現時点で最善の策は、UITextFieldをラップすることです– Matteo Pacini

要約すると、今のところUITextFieldのラップに悩まされていると思います。

0
Aaron Bertsch