Objective c 当绑定属性更改时自动创建新实体

Objective c 当绑定属性更改时自动创建新实体,objective-c,cocoa,core-data,cocoa-bindings,key-value-observing,Objective C,Cocoa,Core Data,Cocoa Bindings,Key Value Observing,我有一个基于实体的NSObjectController,它被配置为使用它从提取请求创建的“MyProperty”对象,如下所示: @interface MyPropertyController : NSObjectController @property (strong) NSString *propertyName; @end @implementation MyPropertyController - (instancetype)initWithPropertyName:(NSStrin

我有一个基于实体的
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
本身中应该有一个正确的方法来实现这一点。

您可以通过使用容器对象作为对象控制器的对象来解决这个问题,对象控制器总是存在的。这个容器对象将实体保存在属性中

然后可以重载
设置值:forKeyPath:
,并确保在设置新值之前创建实体


另一个想法是为您的实体使用
NSProxy
,但是使用
KVO

很难做到这一点,我也可以通过覆盖NSObjectController子类本身中的setValue:forKeyPath:并惰性地创建属性来解决这个问题。但我觉得必须有一个“正确”的方法来做。