【问题标题】:Automatically create new entity when bound property changes绑定属性更改时自动创建新实体
【发布时间】:2013-08-27 13:56:44
【问题描述】:

我有一个基于实体的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 绑定到一个滑块,这样用户就可以更改边的值:

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 本身中执行此操作的正确方法。

【问题讨论】:

    标签: objective-c cocoa core-data cocoa-bindings key-value-observing


    【解决方案1】:

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

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

    另一个想法是为您的实体使用NSProxy,但使用KVO 很难做到这一点。

    【讨论】:

    • 我也可以通过在 NSObjectController 子类本身中重写 setValue:forKeyPath: 并懒惰地创建属性来解决它。但我觉得必须有一个“正确”的方法来做到这一点。
    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 2010-10-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多