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。