Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Objective c Cocoa:NSMutableString绑定到XIB不会更新,但NSString绑定会更新_Objective C_Cocoa_Nsmutablestring - Fatal编程技术网

Objective c Cocoa:NSMutableString绑定到XIB不会更新,但NSString绑定会更新

Objective c Cocoa:NSMutableString绑定到XIB不会更新,但NSString绑定会更新,objective-c,cocoa,nsmutablestring,Objective C,Cocoa,Nsmutablestring,当我更改字符串时,绑定到NSMutableString属性的XIB中的标签似乎不会更新,但如果属性为NSString,则标签会更新 在测试应用程序中,我有默认的AppDelegate类和MainMenu.xib。我在AppDelegate中创建了两个属性,一个NSString和一个NSMutableString,并将它们绑定到XIB中的两个标签。我有两个按钮可以将这些字符串的值从一个集合更改为另一个集合并返回。代码如下所示。NSLog的输出显示NSMutableString的值正在更改,但没有反

当我更改字符串时,绑定到NSMutableString属性的XIB中的标签似乎不会更新,但如果属性为NSString,则标签会更新

在测试应用程序中,我有默认的AppDelegate类和MainMenu.xib。我在AppDelegate中创建了两个属性,一个NSString和一个NSMutableString,并将它们绑定到XIB中的两个标签。我有两个按钮可以将这些字符串的值从一个集合更改为另一个集合并返回。代码如下所示。NSLog的输出显示NSMutableString的值正在更改,但没有反映在GUI中

不知道我错过了什么。。任何帮助都将不胜感激

PS:EDIT:我希望在不创建新的可变字符串的情况下实现这一点

代码:


删除上面的代码行,然后在下面的代码行中尝试设置绑定到标签的可变和不可变对象中的字符串

    NSString * str=@"yourString";
    self.mutLabel=[str mutableString];
    self.unmutLabel=str;

根据文档,调用
willChangeValueForKey:
didChangeValueForKey:
在适当的情况下应该是支持绑定所需的一切。但是,据我通过实验*确定,如果AppKit文本视图的绑定属性在更新前后引用了相同的对象,则它们的文本内容(
NSTextField
NSTextView
)将不会更新。实验表明,观察发生了,但被忽略了;据推测,视图包含避免不必要更新的逻辑

简而言之,
NSTextView
NSTextField
的绑定与
NSMutableString
不兼容。除非您有其他理由使用可变字符串,否则您最好坚持使用不可变的版本


*苹果的开源版本中似乎没有包含AppKit,因此检查源代码不是一个选项。

尝试使用mutlab.string而不是mutlab?KVC查找setter/getter调用,因此setString/string基本上是可变字符串对象上字符串“属性”的访问器。@stevesliva:尝试过,我遇到了崩溃。。“类不是关键值编码投诉”啊。真烦人。(因为没有一个类同时支持setter和getter?)。当绑定正在查找setter时,您可能会收到该错误消息——可以尝试将mutLabel.string绑定到按钮标题或其他工具提示。只读绑定可能会起作用。如果单向绑定起作用,可能有一种方法可以让值绑定永远不寻找setter。Hussain,谢谢!您的解决方案是可行的,但它不是每次都创建一个新的可变字符串吗?例如,如果我声明第三个属性“pointToMutLabel”,并将其定义为“pointToMutLabel=mutLabel”,那么这两个字符串在更改后不会跟踪。如果您有第三个属性,然后声明为self.pointToMutLabel=[str mutableString],那么我希望在不创建新字符串的情况下实现这一点;就像前面的可变字符串一样。因此,它将确保在所有可变字符串中使用一个字符串变量。我想做的是:在我的实际应用程序中,AppDelegate首先处理一些时变数据以生成一组字符串,因此无法再次实例化。根据套接字中断,这些字符串会不时更新。我有几个显示这些字符串的XIB,每个XIB都有自己的NSWindowController,它在AppDelegate中实例化。如何将这些XIB中的标签绑定到AppDelegate中的字符串属性,而不将AppDelegate实例化为XIB中的对象?我认为解决方案是创建NSMutableString属性并“将其等同”确定,然后始终使用新值str=[self.mutLabel string]更新NSString;并将该字符串传递给新的self.pointMutLabel=[str mutableString];
    NSString * str=@"yourString";
    self.mutLabel=[str mutableString];
    self.unmutLabel=str;