微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何添加onCommit,isEditing和具有对自定义textview进行自定义绑定的功能?

如何解决如何添加onCommit,isEditing和具有对自定义textview进行自定义绑定的功能?

赋予下面的UIViewRepresentable isEditing和onCommit属性的最佳方法是什么?我希望它在SwiftUI中对TextField的调用具有相同的确切功能(您可以在其中添加代码,用于按[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
    }
    )

解决方法

onCommit

您可以将函数作为变量传递,以使它们在正确的位置执行,例如:

struct TextView: UIViewRepresentable {
    @Binding var text: String

    var onCommit: ()->()
    ...
}

... {
        ...
        func textView(_ textView: UITextView,shouldChangeTextIn range: NSRange,replacementText text: String) -> Bool {
            if (text == "\n") {
                textView.resignFirstResponder()
                parent.onCommit() // <- execute here
            }
            return true
        }
}

并像这样使用它:

TextView(text: $text,onCommit: {
    print("Committed")
})

可以应用类似的检测变化的方法


onEditting

您可以使用类似我上面解释的onCommit的方法,或者,如果您使用的是 SwiftUI 2.0 ,则可以观察{ {1}}修饰符(如果实际值从.onChange一侧变化),例如:

SwiftUI

更新实际的struct ContentView: View { @State var text: String = "" var body: some View { TextView(text: $text) .onChange(of: text) { value in print("text now: " + text) } } } 值:

您需要通过在@Binding中实现此功能来更新text中的{strong> UIKit

coordinator

然后,实际绑定变量将根据textField的文本更改事件进行更新。


?Bouns

使用此方法,您还可以将配置步骤转发到func textViewDidChange(_ textView: UITextView) { parent.text = textView.text } 侧。因此,重构后的完整工作代码如下:

SwiftUI

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?