J'ai un dilemme que je n'arrive pas à résoudre. J'ai appliqué un certain KVO par une liaison à une propriété sur un modèle, cependant, parce que je n'assigne pas par la notation de point le KVO ne se fait pas virer. Au lieu de cela, je suis donc comme AJOUT DE:NSMutableAttributedString Notification de non-déclenchement KVO
[[self messagesString] appendAttributedString:attrVal];
messagesString
est un NSMutableAttributedString
. Bien sûr, cela ne déclenchera pas la notification KVO, donc je fais ce qui suit:
[self willChangeValueForKey:@"messagesString"];
[[self messagesString] appendAttributedString:attrVal];
[self didChangeValueForKey:@"messagesString"];
Mais je n'ai pas de chance avec ça. Si je fais ce qui suit:
NSAttributedString *attrVal = [[NSAttributedString alloc] initWithString:str];
[self willChangeValueForKey:@"messagesString"];
[[self messagesString] appendAttributedString:attrVal];
[self didChangeValueForKey:@"messagesString"];
messagesString = [[NSMutableAttributedString alloc] initWithAttributedString:messagesString];
Ensuite, cela fonctionne très bien. Cependant, si je supprime la ligne d'ajout, cela ne fonctionne pas. Il semble que ce soit dans cet ordre, y compris ces choses, pour que cela fonctionne.
Qu'est-ce qui me manque si évident pour lancer la notification du KVO?
EDIT
Alors, je l'ai arraché toute substance non pertinente de cette déclaration de classe, mais voici la principale dont je parlais:
#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
Et la mise en œuvre
#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
Je fais initWithString
pour le NSMutableAttributedString
car il y a quelques bizarreries dans la façon dont vous utilisez un i nstance de cette classe si elle n'a pas déjà une chaîne vide (appendAttributedString
a des problèmes si aucune valeur n'a été définie lors de l'instanciation soi-disant).
Voilà comment une chaîne est ajoutée à elle dans une classe à part entière:
Channel *c = [channels valueForKey:@"server"];
[c appendString:val];
Enfin, mon interface utilisateur a une liaison pour un NSTextView
sur la propriété Chaîne Attribuée pour aller à self.currentChannel.messagesString
. Je ne suis pas sur mon Mac pour le moment, donc je ne peux pas montrer ces morceaux.
La méthode appendString
dans ma classe Channel
a l'air d'être comme ça parce que je travaillais pour la faire fonctionner. Beaucoup de code de jeu.
Quelle est la déclaration de propriété de messageString? –
Pouvez-vous poster votre appel d'installation d'observation et la méthode de surveillance des changements? –
@BrianPalma mon post mis à jour montre ceci. – Kezzer