具有类别和委托的 NSManagedObject
NSManagedObject with Category and Delegate
我创建了一个名为 MapState 的 NSManagedObject
。然后我为它创建了一个类别来调用一些方法并存储一些额外的变量。
.h
#import "MapStateDB.h"
@protocol MapStateDelegate;
@interface MapStateDB (MapState)
@property (weak, nonatomic) id <MapStateDelegate> delegate;
-(void)selectedSceneObject:(SceneObject *)sceneObject;
-(void)removeDisplayedScene;
@end
@protocol MapStateDelegate <NSObject>
-(void)displayScene:(SceneDB *)scene inState:(NSString *)state;
-(void)removeScene:(SceneDB *)scene;
@end
在.m:
@dynamic delegate;
-(void)setDelegate:(id<MapStateDelegate>)delegate {
}
我该怎么做setter?通常它只是:
-(void)setDelegate:(id<MapStateDelegate>)delegate {
_delegate = delegate;
}
但是由于变量是 @dynamic
而不是 @synthesize
,所以没有创建 _delegate
。 @synthesize
会产生错误。
我该如何处理?
使用 @dynamic
意味着将在 运行 时创建适当的访问器。 NSManagedObject
对数据模型中实体的属性执行此操作,但不对您声明的属性执行此操作。您 可以 使用一些 ObjC 运行 时间魔法来做到这一点(所有 API 都存在并且受到支持,所以这不是所谓的 hack),但这并非微不足道。 (如果 delegate
是实体上的瞬态 属性,则使用 @dynamic
会很好,但这意味着委托必须是 Core Data 支持的类型之一,而不是任何class 实施协议)。
但还是有希望的!如果您使用 Xcode 7+ 生成 NSManagedObject
subclasses,则可以安全地在 subclass 中添加您自己的属性,而不必担心它们被覆盖。您可以通过为 delegate
属性 添加 @synthesize
然后不添加您自己的 setter 来使其工作。您不必提供一个,除非您需要做的不仅仅是设置 属性 值。
如果您 需要自定义 setter,请将 @synthesize
修改为
@synthesize delegate = _delegate;
(你不必在这里使用_delegate
,任何有效的名称都可以)
然后添加一个 setter,就像您问题中分配给合成名称的那个。
我创建了一个名为 MapState 的 NSManagedObject
。然后我为它创建了一个类别来调用一些方法并存储一些额外的变量。
.h #import "MapStateDB.h"
@protocol MapStateDelegate;
@interface MapStateDB (MapState)
@property (weak, nonatomic) id <MapStateDelegate> delegate;
-(void)selectedSceneObject:(SceneObject *)sceneObject;
-(void)removeDisplayedScene;
@end
@protocol MapStateDelegate <NSObject>
-(void)displayScene:(SceneDB *)scene inState:(NSString *)state;
-(void)removeScene:(SceneDB *)scene;
@end
在.m:
@dynamic delegate;
-(void)setDelegate:(id<MapStateDelegate>)delegate {
}
我该怎么做setter?通常它只是:
-(void)setDelegate:(id<MapStateDelegate>)delegate {
_delegate = delegate;
}
但是由于变量是 @dynamic
而不是 @synthesize
,所以没有创建 _delegate
。 @synthesize
会产生错误。
我该如何处理?
使用 @dynamic
意味着将在 运行 时创建适当的访问器。 NSManagedObject
对数据模型中实体的属性执行此操作,但不对您声明的属性执行此操作。您 可以 使用一些 ObjC 运行 时间魔法来做到这一点(所有 API 都存在并且受到支持,所以这不是所谓的 hack),但这并非微不足道。 (如果 delegate
是实体上的瞬态 属性,则使用 @dynamic
会很好,但这意味着委托必须是 Core Data 支持的类型之一,而不是任何class 实施协议)。
但还是有希望的!如果您使用 Xcode 7+ 生成 NSManagedObject
subclasses,则可以安全地在 subclass 中添加您自己的属性,而不必担心它们被覆盖。您可以通过为 delegate
属性 添加 @synthesize
然后不添加您自己的 setter 来使其工作。您不必提供一个,除非您需要做的不仅仅是设置 属性 值。
如果您 需要自定义 setter,请将 @synthesize
修改为
@synthesize delegate = _delegate;
(你不必在这里使用_delegate
,任何有效的名称都可以)
然后添加一个 setter,就像您问题中分配给合成名称的那个。