Objective c 为什么';是否在UI中更新此属性?
我有一个简单的应用程序:一个绑定到Objective c 为什么';是否在UI中更新此属性?,objective-c,cocoa,binding,key-value-observing,Objective C,Cocoa,Binding,Key Value Observing,我有一个简单的应用程序:一个绑定到item.title的文本框。此属性作为NSString公开,但在内部是NSMutableString 问题:对title属性的更改不会反映在UI中 以下是项的实现: @interface Item : NSObject { NSMutableString *_title; } @property NSString *title; @end 以及实施: @implementation Item -(void)mutateTitle { [
item.title
的文本框。此属性作为NSString
公开,但在内部是NSMutableString
问题:对title
属性的更改不会反映在UI中
以下是项
的实现:
@interface Item : NSObject
{
NSMutableString *_title;
}
@property NSString *title;
@end
以及实施:
@implementation Item
-(void)mutateTitle
{
[self willChangeValueForKey:@"title"];
[_title appendString:@"mutated"];// this does not work
//_title = [[NSMutableString alloc] initWithString:@"new instance"];// this works
[self didChangeValueForKey:@"title"];
}
-(NSString *)title
{
NSLog(@"get title returning: %@", _title);
return _title;
}
-(void)setTitle:(NSString *)title
{
_title = [[NSMutableString alloc] initWithString:title];
}
@end
当按下按钮时,我们将mutateTile
发送到该项目,该项目会更改标题,并将属性更改通知KVO
UI对更改做出响应,当调用title
时,我们返回正确的字符串
但用户界面并不反映这些变化
请注意,如果我取消注释将新实例分配给\u title
的行,则更新将正常进行
此外,如果title
返回\u title
的副本,它也可以正常工作
为什么会这样?有没有办法让这件事按我的意愿进行
*编辑:
标题
正在代码的其他位置分配;它不是<代码> NIL ./P>< P>这是因为如果可变字符串发生突变,但属性没有改变(指针仍然指向同一个对象),那么KVC就不会认为它是真正的改变。这可能是出于效率原因(如果调用了didChangeValueForKey:
,但字符串相同,则无需更新UI)
我建议不要使用可变字符串,它不符合您的目的。只需使用普通字符串,而不是对其进行变异,然后重新分配:
-(void)mutateTitle
{
[self willChangeValueForKey:@"title"];
_title= [_title stringByAppendingString: @"mutated"];
[self didChangeValueForKey:@"title"];
}
最好对KVC使用
self.propertyName
。我相信\u属性不像self.property那样执行KVC。