我有一个我似乎无法解决的困境。但是,我通过绑定到模型上的属性应用了一些 KVO,因为我没有通过点符号分配 KVO 不会被触发。相反,我像这样附加:
[[self messagesString] appendAttributedString:attrVal];
messagesString
是一个NSMutableAttributedString
。当然这不会启动 KVO 通知,所以我改为执行以下操作:
[self willChangeValueForKey:@"messagesString"];
[[self messagesString] appendAttributedString:attrVal];
[self didChangeValueForKey:@"messagesString"];
但我没有运气。如果我执行以下操作:
NSAttributedString *attrVal = [[NSAttributedString alloc] initWithString:str];
[self willChangeValueForKey:@"messagesString"];
[[self messagesString] appendAttributedString:attrVal];
[self didChangeValueForKey:@"messagesString"];
messagesString = [[NSMutableAttributedString alloc] initWithAttributedString:messagesString];
然后它工作正常。但是,如果我删除附加行,它就不起作用。似乎它必须按照这个顺序,包括这些东西,才能工作。
我错过了什么如此明显的启动KVO通知?
编辑
所以,我已经从这个类声明中删除了所有不相关的东西,但这是我所指的主要内容:
#import <Foundation/Foundation.h>
@interface Channel : NSObject {
NSString* name;
NSMutableAttributedString *messagesString;
}
@property (retain) NSString* name;
@property (retain) NSMutableAttributedString* messagesString;
- (id)initWithName:(NSString*)name;
- (void)appendString:(NSString*)str;
@end
以及实施
#import "Channel.h"
@implementation Channel
@synthesize name;
@synthesize messagesString;
- (id)initWithName:(NSString *)channelName {
self = [super init];
if (self)
{
[self setName:channelName];
messagesString = [[NSMutableAttributedString alloc] initWithString:@" "];
}
return self;
}
- (void)appendString:(NSString *)str {
NSAttributedString *attrVal = [[NSAttributedString alloc] initWithString:str];
[self willChangeValueForKey:@"messagesString"];
[[self messagesString] appendAttributedString:attrVal];
[self didChangeValueForKey:@"messagesString"];
messagesString = [[NSMutableAttributedString alloc] initWithAttributedString:messagesString];
}
@end
我这样做initWithString
是NSMutableAttributedString
因为如果它还没有空字符串(appendAttributedString
如果在实例化时没有设置任何值,则有问题),您使用此类实例的方式会有些奇怪。
这是在一个完全独立的类中将字符串附加到它的方式:
Channel *c = [channels valueForKey:@"server"];
[c appendString:val];
最后,我的 UI 在 Attributed String 属性上有一个绑定,NSTextView
可以转到self.currentChannel.messagesString
. 我现在不在我的 Mac 上,所以我无法显示这些位。
appendString
我班上的方法Channel
看起来就像是因为我在玩弄它来让它工作。非常玩代码。