objective-c - 绑定(bind)属性更改时自动创建新实体

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

我有一个基于实体的 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 绑定(bind)到 slider ,以便用户可以更改 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 }];

只要用户拖动 slider 时 MyProperty 实例存在,这一切都有效。但是,如果用户拖动 slider 并且 MyProperty 实例尚不存在,我希望自动创建该属性的实例。

这可能吗?我能够实现它的唯一方法是使用自定义的 NSValueTransformer,它使用 reverseTransformedValue 手动创建和插入该类的实例,但我可以我不禁觉得 NSObjectController 本身应该有一种正确的方法来做到这一点。

最佳答案

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

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

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

关于objective-c - 绑定(bind)属性更改时自动创建新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18467508/

相关文章:

ios - 主观 iPhone/Core 数据设置民意调查

ios - Swift 3 核心数据获取问题

objective-c - Objective C 中的静默安装

ios - 在 iOS 中调用插入行到 IndexPath 后由于某种原因不保存数据

objective-c - NSCalendar 和 NSDateComponents 返回意外日期

objective-c - 如何让 OS X 设置 NSWindow 的初始位置

objective-c - PackageMaker 的麻烦

ios - "NSMutableArray"没有可见的@interface 声明选择器 'addObject:initWithBackgroundImage:'

ios - 在SCNView上启用用户交互后,如何让它只水平旋转?

ios - CoreData 撤消操作顺序,ManagedObjectContext 与手动添加的任务