我创建了一个名为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 {
}
我如何做二传手?通常它只是:
-(void)setDelegate:(id<MapStateDelegate>)delegate {
_delegate = delegate;
}
但由于变量为@dynamic
而非@synthesize
,因此不会创建_delegate
。 @synthesize
会产生错误。
我该如何处理?
答案 0 :(得分:2)
使用@dynamic
意味着将在运行时创建相应的访问者。 NSManagedObject
为数据模型中的实体属性执行此操作,但不对您声明的属性执行此操作。您可以使用一些ObjC运行时向导来执行此操作(API都存在,并且受支持,因此它不是可能被称为黑客的),但它并非无足轻重。 (如果@dynamic
是实体上的瞬态属性,则使用delegate
会很好,但这意味着委托必须是Core Data支持的类型之一,而不是任何实现协议的类)。
但是有希望!如果您正在使用Xcode 7+生成NSManagedObject
子类,则可以安全地在子类中添加您自己的属性,而不必担心它们会被覆盖。您可以为delegate
属性添加@synthesize
,然后不添加自己的setter。除非您需要做的不仅仅是设置属性值,否则您不必提供一个。
如果您执行需要自定义设置器,请将@synthesize
修改为
@synthesize delegate = _delegate;
(你不必在这里使用_delegate
,任何有效名称都可以)
然后添加一个类似你问题中的一个setter来指定合成名称。