可可新手在這裏。我正在開發基於iPhone UITableViewController的小部件,該小部件可用於在啓動期間編輯對象集中的日期和文本屬性。目前,我正在嘗試使用@selector和NSInvocation來做到這一點,如下所示。 注意:「targetObject」是控制器初始化時設置的對象。如何使用@selector和NSInvocation從另一個對象調用NSManaged對象的@dynamic方法?
- (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];
}
這對大多數對象都可以正常工作,但傳入Core Data(NSManagedObject)作爲targetObject時遇到了麻煩。物體看起來是這樣的:
Transaction.h
#import <CoreData/CoreData.h>
@interface Transaction : NSManagedObject
{
}
@property (nonatomic, retain) NSString * message;
@property (nonatomic, retain) NSDate * date;
@end
Transaction.m
#import "Transaction.h"
@implementation Transaction
@dynamic message;
@dynamic date;
@end
如果我在控制器作爲targetObject此對象,我可以調用 「的setDate:」方法直接沒有問題。
[targetObject setDate:[datePicker date]];
但是,當我嘗試用@selector來調用它,我得到「程序接收到的信號:「EXC_BAD_ACCESS
」。」
我想這與NSManagedObject中使用的@dynamic方法有關,當它們被創建時,但我不知道該過程知道如何或者是否可以解決此問題以使其工作。我已經嘗試在Transaction對象中顯式創建「setDate:(NSDate *)aDate」方法,並且該方法可行,但我想知道是否應該這樣做,以及它如何可能NSManagedObject。
我可以訪問這些setter方法與@selector但沒有明確定義它們
爲什麼你需要爲此使用NSInvocation? – 2009-10-15 02:08:07
澄清:NSObject的performSelector系列消息以何種方式不適合您的需求?很少有人需要使用NSInvocation,我也沒有看到任何理由說明你會成爲這個片段中的一員。 – 2009-10-15 02:34:20