解決できないジレンマに悩んでいます。モデルのプロパティへのバインディングを介して 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 にはNSTextView
、属性付き文字列プロパティに移動するためのバインディングがありself.currentChannel.messagesString
ます。現時点では Mac を使用していないため、これらのビットを表示できません。
私のクラスのappendString
メソッドは、Channel
動作させるためにいじっていたので、そのままのように見えます。非常に多くのコードを再生します。