【发布时间】:2014-03-17 11:23:02
【问题描述】:
我有一个简单的应用程序:绑定到item.title 的文本框。此属性公开为NSString,但在内部是NSMutableString。
问题:对 title 属性的更改未反映在 UI 中。
这里是item的实现:
@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
当一个按钮被按下时,我们发送mutateTitle给item,它改变标题,并通知KVO属性改变。
UI 确实会响应更改,当调用 title 时,我们会返回正确的字符串。
但是 UI 并没有反映这些变化。
请注意,如果我取消注释将新实例分配给 _title 的行,则更新会正常进行。
另外,如果title 返回_title 的副本,它也可以正常工作。
为什么会这样?有什么方法可以让我按照自己的意愿完成这项工作吗?
*edit: title 被分配到代码的其他地方;不是nil。
【问题讨论】:
-
KVC 最好使用
self.propertyName。 -
我相信 _property 不像 self.property 那样做 KVC。
标签: objective-c cocoa binding key-value-observing