problem with pure automatic KVO for array (no controllers...)
problem with pure automatic KVO for array (no controllers...)
- Subject: problem with pure automatic KVO for array (no controllers...)
- From: Michael Monscheuer <email@hidden>
- Date: Sat, 21 May 2005 23:29:33 +0200
I just had a hard time with KVO.
For to-one relationships my observer gets a NSKeyValueChangeSetting message.
For to-many it does not.
The accessor of my observed instance returns a mutable array.
Observer registers for the key of the mutable array returning accessor of observed instance.
So the observed property is a to-many relationship.
I expected the observer to get a NSKeyValueChangeInsertion info.
It just does not work.
Any idea? You'll find an example project below...
michael
--
=======================================================
//
// main.m
// KVO test
//
#import <Cocoa/Cocoa.h>
// -------- observing class -------
@interface DSDFooObserver : NSObject
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void
*)context;
@end
@implementation DSDFooObserver
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void
*)context {
NSLog(@"observer change kind:%@",[change objectForKey:NSKeyValueChangeKindKey]);
}
@end
// ------- observed class ------------
@interface DSDFooTest:NSObject {
NSMutableArray *testArray;
}
// simple accessors
-(NSMutableArray *)testArray;
-(void)setTestArray:(NSMutableArray *)newArray;
@end
@implementation DSDFooTest
// init
-(id)init
{
self = [super init];
if (self) {
testArray = [[NSMutableArray array] retain];
}
return self;
}
// deallocation
-(void) dealloc {
[testArray release];
[super dealloc];
}
// get accesor
-(NSMutableArray *)testArray {
return testArray;
}
// set accessor
-(void)setTestArray:(NSMutableArray *)newArray {
[testArray release];
testArray = [newArray retain];
}
@end
// ------- main ------------
int main(int argc, char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// creating observed instance
DSDFooTest *testObject = [[DSDFooTest alloc] init];
// creating observing instance
DSDFooObserver *observer = [[DSDFooObserver alloc] init];
[testObject addObserver:observer forKeyPath:@"testArray" options:0 context:NULL];
// this insertion does not inform observer
[[testObject testArray] insertObject:[[NSObject alloc] init] atIndex:0];
// setting a new array to observed instance informs observer
[testObject setTestArray:[NSArray array]];
[pool release];
return 0;
}
//
// main.m
// KVO test
//
#import <Cocoa/Cocoa.h>
// -------- observing class -------
@interface DSDFooObserver : NSObject
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
@end
@implementation DSDFooObserver
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSLog(@"observer change kind:%@",[change objectForKey:NSKeyValueChangeKindKey]);
}
@end
// ------- observed class ------------
@interface DSDFooTest:NSObject {
NSMutableArray *testArray;
}
// simple accessors
-(NSMutableArray *)testArray;
-(void)setTestArray:(NSMutableArray *)newArray;
@end
@implementation DSDFooTest
// init
-(id)init
{
self = [super init];
if (self) {
testArray = [[NSMutableArray array] retain];
}
return self;
}
// deallocation
-(void) dealloc {
[testArray release];
[super dealloc];
}
// get accesor
-(NSMutableArray *)testArray {
return testArray;
}
// set accessor
-(void)setTestArray:(NSMutableArray *)newArray {
[testArray release];
testArray = [newArray retain];
}
@end
// ------- main ------------
int main(int argc, char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// creating observed instance
DSDFooTest *testObject = [[DSDFooTest alloc] init];
// creating observing instance
DSDFooObserver *observer = [[DSDFooObserver alloc] init];
[testObject addObserver:observer forKeyPath:@"testArray" options:0 context:NULL];
// this insertion does not inform observer
[[testObject testArray] insertObject:[[NSObject alloc] init] atIndex:0];
// setting a new array to observed instance informs observer
[testObject setTestArray:[NSArray array]];
[pool release];
return 0;
}
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden