2

我有一個實體的基於被配置爲使用一個「myProperty的」 NSObjectController對象從一個取指令請求創建,像這樣:自動創建新的實體時綁定屬性改變

@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 

在我結合UIMyProperty.numberValue一個滑塊,使用戶可以改變代爾的價值:只要MyProperty實例當用戶拖動滑塊存在

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實例尚不存在,我想自動創建該屬性的實例。

這可能嗎?我已經能夠完成它的唯一方法是使用自定義NSValueTransformer,它使用reverseTransformedValue來手動創建並插入類的實例,但我不禁覺得應該有一個正確的方法來做這在NSObjectController本身。

回答

0

你也許可以通過使用容器對象作爲你的對象控制器的對象來解決這個問題,它始終存在。這個容器對象將實體保存在一個屬性中。

然後,您可以重載setValue:forKeyPath:並確保在設置新值之前創建實體。

另一個想法是使用NSProxy爲您的實體,但這將很難與KVO正確。

+0

我也可以通過在NSObjectController子類本身中重寫setValue:forKeyPath:並且延遲創建屬性來解決它。但我覺得那裏一定要有一個「正確」的方式來做到這一點。 –

相關問題