SwiftuiにUIKitのTextFieldを入れて使用しています。
SwiftUI独自のTextFieldでは文字入力に不具合があるためです。
クリアボタン並びに登録ボタンを押したあとにテキストフィールド内を空にしたいのですが、表示上空にすることができません。
登録ボタンを押した直後に、登録ボタンのdisabledは認識されますが、画面表示は残ってしまいます。
よろしくお願いいたします。
swift
1import SwiftUI 2import CoreData 3 4struct InputMenuView: View { 5 6 @Environment(.managedObjectContext) var context 7 8 func addMessage(){ 9 let newMessage = BtList(context: context) 10 newMessage.id = UUID() 11 newMessage.isComplete = false 12 newMessage.message = registerMessage 13 newMessage.saveDate = Date() 14 do{ 15 try context.save() 16 }catch{ 17 print(error) 18 } 19 } 20 21 @State var registerMessage = "" 22 23 24 var textFieldWidth = UIScreen.main.bounds.width*9/10 25 var body: some View { 26 VStack{ 27 HStack{ 28 //キャンセルボタン 29 Button(action:{ 30 self.registerMessage = "" 31 32 UIApplication.shared.endEditing() 33 }){ 34 Image(systemName: "xmark.circle").font(.title) 35 } 36 Spacer() 37 38 //登録ボタン 39 Button(action:{ 40 self.addMessage() 41 print(self.registerMessage) 42 self.registerMessage = "" 43 print("(self.registerMessage)です。") 44 }){ 45 Image(systemName: "plus.circle").font(.title) 46 }.disabled(self.registerMessage.isEmpty) 47 48 }//HStack 49 MakeTextField(title: "#今日の体調",text:self.$registerMessage ) 50 .fixedSize() 51 52 }//VStack 53}//body 54}//View
swift
1 2import SwiftUI 3 4var textFieldWidth = UIScreen.main.bounds.width 5var textFieldHeight = 5 6 7final class _TextFieldCoordinator: NSObject { 8 var control: MakeTextField 9 10 init(_ control: MakeTextField) { 11 self.control = control 12 super.init() 13 control.textField.addTarget(self, action: #selector(textFieldEditingDidBegin(_:)), for: .editingDidBegin) 14 control.textField.addTarget(self, action: #selector(textFieldEditingDidEnd(_:)), for: .editingDidEnd) 15 control.textField.addTarget(self, action: #selector(textFieldEditingChanged(_:)), for: .editingChanged) 16 control.textField.addTarget(self, action: #selector(textFieldEditingDidEndOnExit(_:)), for: .editingDidEndOnExit) 17 } 18 19 @objc private func textFieldEditingDidBegin(_ textField: UITextField) { 20 control.onEditingChanged(true) 21 } 22 23 @objc private func textFieldEditingDidEnd(_ textField: UITextField) { 24 control.onEditingChanged(false) 25 } 26 27 @objc private func textFieldEditingChanged(_ textField: UITextField) { 28 control.text = textField.text ?? "" 29 } 30 31 @objc private func textFieldEditingDidEndOnExit(_ textField: UITextField) { 32 control.onCommit() 33 } 34} 35 36struct MakeTextField: UIViewRepresentable { 37 38 private let title: String? 39 @Binding var text: String 40 let onEditingChanged: (Bool) -> Void 41 let onCommit: () -> Void 42 43 let textField = UITextField() 44 45 init(title: String?, text: Binding<String>, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) { 46 self.title = title 47 self._text = text 48 self.onEditingChanged = onEditingChanged 49 self.onCommit = onCommit 50 } 51 52 func makeCoordinator() -> _TextFieldCoordinator { 53 _TextFieldCoordinator(self) 54 } 55 56 func makeUIView(context: Context) -> UITextField { 57 textField.placeholder = title 58 textField.delegate = context.coordinator as? UITextFieldDelegate 59// textField.backgroundColor = UIColor.gYellow 60 61 textField.borderStyle = UITextField.BorderStyle.roundedRect 62 textField.frame = CGRect(x: 0, y: 0, width: Int(textFieldWidth), height: Int(textFieldWidth)/8) 63 return textField 64 } 65 66 func updateUIView(_ uiView: UITextField, context: Context) { 67 } 68} 69
あなたの回答
tips
プレビュー