2015-11-20 2 views
0

Я создал NSManagedObject, называемый 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

Возможно, вы должны обработать это с помощью класса-оболочки вместо расширения ... – Wain

+0

Это мой второй вариант. – Padin215

ответ

2

Использование @dynamic подразумевает, что соответствующие аксессоры будут созданы во время выполнения. NSManagedObject делает это для атрибутов объектов в модели данных, но не для свойств, которые вы заявляете. Вы могли бы сделать это с помощью некоторого мануфактуры времени выполнения ObjC (все API существуют и поддерживаются, поэтому это не то, что можно назвать хаком), но это не тривиально. (Использование @dynamic было бы неплохо, если delegate были временным свойством на сущности, но это означало бы, что делегат должен быть одним из типов, поддерживаемых Core Data, а не любым классом, реализующим протокол).

Но есть надежда! Если вы используете Xcode 7+ для генерации подклассов NSManagedObject, безопасно добавлять свои собственные свойства в подкласс, не опасаясь их перезаписывания. Вы сделали бы работу delegate, добавив для нее @synthesize, а затем не добавляя свой собственный сеттер. Вам не нужно предоставлять его, если вам не нужно делать больше, чем просто установить значение свойства.

Если вы сделать нужны пользовательские сеттер, изменить @synthesize быть что-то вроде

@synthesize delegate = _delegate; 

(вы не должны использовать _delegate здесь, любое допустимое имя прекрасно)

Тогда добавьте сеттер, аналогичный тому, который задан для вашего синтезированного имени.

+0

Имейте в виду, что добавление свойств к 'NSManagedObject' может быть упражнением в расстройстве, так как время жизни такого объекта не полностью под вашим контролем. Если в вашем приложении имеется только один «NSManagedObjectContext», вы можете быть уверены в сохранении ссылок на ваши объекты. Тем не менее, только самые тривиальные приложения настроены таким образом. – Avi

+0

Я подклассифицировал свой 'NSManagedObject' и, похоже, работает. Я могу '@synthesize delegate = _delegate', и он отлично работает, спасибо! @Avi: Я знаю, что если контекст становится нулевым, временные управляемые объекты перестанут существовать. У меня есть основной/стандартный контекст, а также временные контексты, которые сохраняются в основном контексте при выполнении действия сохранения. – Padin215

+0

У меня возникла проблема, когда я не могу создать экземпляр класса. Я задал отдельный вопрос: http://stackoverflow.com/questions/34049208/creating-a-subclass-of-a-nsmanagedobject. – Padin215

Смежные вопросы