2

以下の 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
    }
    )
4

1 に答える 1