我有一个基于实体的NSObjectController
,它被配置为使用它从提取请求创建的“MyProperty”对象,如下所示:
@interface MyPropertyController : NSObjectController
@property (strong) NSString *propertyName;
@end
@implementation MyPropertyController
- (instancetype)initWithPropertyName:(NSString *)propName moc:(NSManagedObjectContext *)moc {
if (self = [super init]) {
self.propertyName = propName;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"propertyName == %@", argumentArray:@[propName]];
self.managedObjectContext = moc;
self.entityName = @"MyProperty";
self.fetchPredicate = predicate;
}
return self;
}
- (id)newObject {
MyProperty *prop = [super newObject];
prop.propertyName = self.propertyName;
return prop;
}
@end
在UI
我将MyProperty.numberValue
绑定到滑块,以便用户可以更改sider的值:
MyPropertyController *controller = [[MyPropertyController alloc] initWithPropertyName:@"some user-specified name" moc:self.managedObjectContext];
NSSlider *slider = [[NSSlider alloc] init];
[slider bind:NSValueBinding toObject:controller withKeyPath:@"content.numberValue" options:@{ NSNullPlaceholderBindingOption : @0 }];
只要用户拖动滑块时存在MyProperty
的实例,就可以找到所有工作。但是,如果用户拖动滑块并且MyProperty
实例尚不存在,我想自动创建属性的实例。
这可能吗?我能够完成它的唯一方法是使用自定义NSValueTransformer
使用reverseTransformedValue
手动创建和插入类的实例,但我不禁感到应该有一种正确的方法在NSObjectController
本身中执行此操作。
答案 0 :(得分:0)
您可以使用容器对象作为对象控制器的对象来解决此问题,该对象始终存在。此容器对象将实体保存在属性中。
然后,您可以重载setValue:forKeyPath:
并确保在设置新值之前创建实体。
另一个想法是为您的实体使用NSProxy
,但使用KVO
很难做到这一点。