Какао новичок здесь. Я работаю над виджетом на основе iPhone UITableViewController, который можно использовать для редактирования свойств даты и текста в наборе объектов во время инициации. В настоящее время я пытаюсь сделать это с помощью @selector и NSInvocation, как показано ниже. Примечание: targetObject — это объект, установленный при инициализации контроллера.
- (IBAction)saveDate:(id)sender {
//The selector below would normally be passed in when the controller is initialized
[self setDoneSelector:@selector(setDate:)];
NSMethodSignature * sig = nil;
sig = [[targetObject class] instanceMethodSignatureForSelector:[self doneSelector]];
NSInvocation * myInvocation = nil;
myInvocation = [NSInvocation invocationWithMethodSignature:sig];
[myInvocation setTarget:targetObject];
[myInvocation setSelector:doneSelector];
NSDate * myDate = [datePicker date];
[myInvocation setArgument:&myDate atIndex:2];
NSString * result = nil;
[myInvocation retainArguments];
[myInvocation invoke];
}
Это отлично работает для большинства объектов, но у меня возникают проблемы при передаче основных данных (NSManagedObject) в качестве целевого объекта. Объект выглядит так:
Транзакция.ч
#import <CoreData/CoreData.h>
@interface Transaction : NSManagedObject
{
}
@property (nonatomic, retain) NSString * message;
@property (nonatomic, retain) NSDate * date;
@end
Транзакция.м
#import "Transaction.h"
@implementation Transaction
@dynamic message;
@dynamic date;
@end
Если я установлю этот объект в своем контроллере как targetObject, я могу напрямую вызвать метод setDate: без проблем.
[targetObject setDate:[datePicker date]];
Но когда я пытаюсь вызвать его с помощью @selector, я получаю «Программа получила сигнал: «EXC_BAD_ACCESS».
Я предполагаю, что это как-то связано с методами @dynamic, используемыми в NSManagedObject, и когда они создаются, но я недостаточно знаю об этом процессе, чтобы знать, как это сделать или могу ли я обойти это, чтобы заставить его работать. Я попытался явно создать метод «setDate: (NSDate *) aDate» в объекте Transaction, и это работает, но мне интересно, должен ли я это делать и как это может привести к NSManagedObject.
Могу ли я получить доступ к этим методам установки с помощью @selector без их явного определения?