如何使Swift协调员反映家长';什么是绑定更改?
假设我有:如何使Swift协调员反映家长';什么是绑定更改?,swift,swiftui,appkit,combine,Swift,Swiftui,Appkit,Combine,假设我有: 结构文档,表示文本文档 EditorView-一个用Combine包装的NSTextView,它绑定到Document.content Document是complexstore:observateObject的一部分,因此它可以绑定到EditorView实例 当我第一次创建绑定时,它按预期工作-编辑NSTextView会更改Document.content中的值 let document1=文档(…) 让document2=文档(…) var editor=EditorView
- 结构
,表示文本文档文档
-一个用Combine包装的EditorView
,它绑定到NSTextView
李>Document.content
Document
是complexstore:observateObject
的一部分,因此它可以绑定到EditorView
实例
当我第一次创建绑定时,它按预期工作-编辑NSTextView会更改Document.content
中的值
let document1=文档(…)
让document2=文档(…)
var editor=EditorView(文档:document1)
但是如果更改绑定到另一个文档
editor.doc=document2
…然后,updateNSView
可以看到新的document2
。但是在Coordiantor的textDidChange
中仍然引用了document1
func textDidChange(uu通知:通知){
guard let textView=notification.object as?NSTextView else{
返回
}
self.parent.doc.content=textView.string
self.selectedRanges=textView.selectedRanges
}
所以,最初,当我设置新的bindint时,NSTextView将其内容更改为document2
,但当我键入时,协调器将更改发送到document1
是真的吗,Coordiantor保留了自己的父项的副本
,即使父项更改(@Binding doc
已更新),它仍然引用旧的副本
如何使协调器反映父绑定的更改
谢谢大家!
struct文档:可识别、可平衡{
let id:UUID=UUID()
变量名称:String
变量内容:字符串
}
结构编辑器视图:NSViewRepresentable{
@绑定var文档:文档
func makeCoordinator()->Coordinator{
协调员(自我)
}
func makeNSView(上下文:context)->CustomTextView{
让textView=CustomTextView(
文本:doc.content,
i可编辑:i可编辑,
字体:字体
)
textView.delegate=context.coordinator
返回文本视图
}
func updateNSView(view:CustomTextView,context:context){
view.text=doc.content
view.selectedRanges=context.coordinator.selectedRanges
}
}
//马克:协调员
扩展编辑器视图{
类协调器:NSObject、NSTextViewDelegate{
变量父对象:EditorView
变量selectedRanges:[NSValue]=[]
init(uu父对象:EditorView){
self.parent=parent
}
func textDidBeginEditing(uu通知:通知){
guard let textView=notification.object as?NSTextView else{
返回
}
self.parent.doc.content=textView.string
self.parent.onEditingChanged()
}
func textDidChange(uu通知:通知){
guard let textView=notification.object as?NSTextView else{
返回
}
self.parent.doc.content=textView.string
self.selectedRanges=textView.selectedRanges
}
func textdidediting(uu通知:通知){
guard let textView=notification.object as?NSTextView else{
返回
}
self.parent.doc.content=textView.string
self.parent.onCommit()
}
}
}
//标记:-自定义文本视图
最终类CustomTextView:NSView{
私有变量可编辑:Bool
私有变量字体:NSFont?
弱变量委托:NSTextViewDelegate?
变量文本:字符串{
迪塞特{
textView.string=text
}
}
// ...
这是真的吗,协调人保存了自己的父母副本,甚至
如果父级更改(@Binding doc已更新),它仍然引用
老的
父级,即这里的EditorView,是struct,所以答案是肯定的,通常它可以被复制
如何使协调器反映父绑定的更改
将绑定注入协调器(通过构造函数),而不是(或附加到)父对象显式地并直接使用它。谢谢!我不太确定如何执行属性:Swift的新功能。请看一下,如何将数据适当地分配给绑定值?Swift告诉我绑定是不可变的结构,因此不能直接分配它的值。@f1nn,请参阅将绑定传递给协调器并使用它的示例。