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

时间:2014-07-06 04:56:18

标签: objective-c cocoa nsmutablestring

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

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

不确定我错过了什么......任何帮助都将不胜感激!

PS:编辑:我想在不创建新的可变字符串

的情况下实现此目的

CODE:

@synthesize mutLabel, unmutLabel;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self willChangeValueForKey:@"mutLabel"];
    mutLabel = [NSMutableString stringWithCapacity:10];
    [mutLabel setString:@"MutLabel 1"];
    [self didChangeValueForKey:@"mutLabel"];

    [self willChangeValueForKey:@"unmutLabel"];
     unmutLabel = @"UnMutLabel 1";
    [self didChangeValueForKey:@"unmutLabel"];

    [self addObserver:self forKeyPath:@"mutLabel" options:0 context:nil];
    [self addObserver:self forKeyPath:@"unmutLabel" options:0 context:nil];
}

- (IBAction)clkBtn1:(id)sender {

    [self willChangeValueForKey:@"mutLabel"];
    [mutLabel setString:@"MutLabel 1"];
    [self didChangeValueForKey:@"mutLabel"];

    [self willChangeValueForKey:@"unmutLabel"];
    unmutLabel = @"UnMutLabel 1";
    [self didChangeValueForKey:@"unmutLabel"];
}

- (IBAction)clkBtn2:(id)sender {

    [self willChangeValueForKey:@"mutLabel"];
    [mutLabel setString:@"MutLabel 2"];
    [self didChangeValueForKey:@"mutLabel"];

    [self willChangeValueForKey:@"unmutLabel"];
    unmutLabel = @"UnMutLabel 2";
    [self didChangeValueForKey:@"unmutLabel"];
}

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"Key change: Key: %@  Value: %@\n",keyPath, [self performSelector:NSSelectorFromString(keyPath)]  );
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

根据文档,就支持KVO而言,在KVO合规性方面,仅需要在适当的地方调用willChangeValueForKey:didChangeValueForKey:。但是,据我可以通过实验*确定,如果它们绑定的属性引用的是同一对象,则AppKit文本视图(NSTextFieldNSTextView)的文本内容不会更新更新前后。实验表明观察发生了,但是被忽略了。大概,视图包含避免不必要更新的逻辑。

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

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