以下の UIViewRepresentable isEditing および onCommit プロパティを与える最良の方法は何ですか? SwiftUI での TextFields の呼び出し時にまったく同じ機能を持たせたい (リターン キーが押されたとき [onCommit] またはテキスト フィールドがクリックされたとき [isEditing] のコードを追加できる)
struct TextView: UIViewRepresentable {
@Binding var text: String
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIView(context: Context) -> UITextView {
let myTextView = UITextView()
myTextView.delegate = context.coordinator
myTextView.font = UIFont(name: "HelveticaNeue", size: 16)
myTextView.isScrollEnabled = true
myTextView.isEditable = true
myTextView.isUserInteractionEnabled = true
myTextView.backgroundColor = UIColor(white: 0.0, alpha: 0.00)
myTextView.textColor = UIColor.black
return myTextView
}
func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = text
}
class Coordinator : NSObject, UITextViewDelegate {
var parent: TextView
init(_ uiTextView: TextView) {
self.parent = uiTextView
}
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if (text == "\n") {
textView.resignFirstResponder()
}
return true
}
func textViewDidChange(_ textView: UITextView) {
print("text now: \(String(describing: textView.text!))")
self.parent.text = textView.text
}
}
}
補足: 理由はわかりませんが、渡したバインディング変数が実際の値を変更していません。get/set プロパティを使用してカスタム バインディングをセットアップしたのに、セットが値を出力していないためです。(この値は、textview に渡されるテキストである必要があります)
let binding = Binding<String>(get: {
self.bindingVariableName
}, set: {
print("set the value")
self.bindingVariableName = $0
}
)