前提・実現したいこと
こんにちは。
SwiftUIでUITextFieldを使う方法について、皆様のお力をお借りできればと思います。
UIViewRepresentableを用いてUITextFieldを表示するところまでは記述できたのですが、Bindingする変数の初期値がViewに反映されず、困っています。
以下のソースコードからViewの表示時にTextField内に"sample"と表示するためにはどうすればいいでしょうか?
ご教授よろしくお願いします。
該当のソースコード
SwiftUI
1struct ContentView: View { 2 @State var text = "sample" 3 var body: some View { 4 MyTextField("", text: $text) 5 } 6} 7 8 9class MyTextFieldCoordinator: NSObject { 10 var control: MyTextField 11 12 init(_ control: MyTextField) { 13 self.control = control 14 super.init() 15 control.textField.addTarget(self, action: #selector(textFieldEditingDidBegin(_:)), for: .editingDidBegin) 16 control.textField.addTarget(self, action: #selector(textFieldEditingDidEnd(_:)), for: .editingDidEnd) 17 control.textField.addTarget(self, action: #selector(textFieldEditingChanged(_:)), for: .editingChanged) 18 control.textField.addTarget(self, action: #selector(textFieldEditingDidEndOnExit(_:)), for: .editingDidEndOnExit) 19 } 20 21 @objc private func textFieldEditingDidBegin(_ textField: UITextField) { 22 control.onEditingChanged(true) 23 } 24 25 @objc private func textFieldEditingDidEnd(_ textField: UITextField) { 26 control.onEditingChanged(false) 27 } 28 29 @objc private func textFieldEditingChanged(_ textField: UITextField) { 30 control.text = textField.text ?? "" 31 } 32 33 @objc private func textFieldEditingDidEndOnExit(_ textField: UITextField) { 34 control.onCommit() 35 } 36} 37 38struct MyTextField: UIViewRepresentable { 39 40 private let title: String? 41 @Binding var text: String 42 let onEditingChanged: (Bool) -> Void 43 let onCommit: () -> Void 44 45 let textField = UITextField() 46 47 init(_ title: String?, text: Binding<String>, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) { 48 self.title = title 49 self._text = text 50 self.onEditingChanged = onEditingChanged 51 self.onCommit = onCommit 52 } 53 54 func makeCoordinator() -> MyTextFieldCoordinator { 55 MyTextFieldCoordinator(self) 56 } 57 58 func makeUIView(context: Context) -> UITextField { 59 textField.placeholder = title 60 textField.delegate = context.coordinator as? UITextFieldDelegate 61 return textField 62 } 63 64 func updateUIView(_ uiView: UITextField, context: Context) { 65 } 66}
補足情報(FW/ツールのバージョンなど)
Xcodeのバージョンは11.6です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。