Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Swift协调员反映家长';什么是绑定更改?_Swift_Swiftui_Appkit_Combine - Fatal编程技术网

如何使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

假设我有:

  • 结构
    文档
    ,表示文本文档
  • EditorView
    -一个用Combine包装的
    NSTextView
    ,它绑定到
    Document.content
Document
是complex
store: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,请参阅将绑定传递给协调器并使用它的示例。