2010-09-13 8 views
0

Я пытаюсь добавить кнопку программно таким образом, чтобы при нажатии на нее пропускался определенный объект. Я продолжаю получать исключение «непризнанного отправителя». Можете ли вы предложить, что не так с кодом:UIButton с NSInvocation

// allocate the details button's action 
    SEL selector = @selector(showPropertyDetails:forProperty:); 
    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector]; 
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
    [invocation setSelector:selector]; 
    //The invocation object must retain its arguments 
    [property retain];  
    //Set the arguments 
    [invocation setTarget:self]; 
    [invocation setArgument:&property atIndex:3];  
    [(UIButton*)[myView viewWithTag:15] addTarget:self action:@selector(selector) forControlEvents:UIControlEventTouchDown]; 

и далее вниз, метод в одном классе выглядит как:

-(void) showPropertyDetails:(id)something forProperty:(Property *)property { 
int i=0; 
} 

ответ

1

В то время как вы строите NSInvocation, вы не используете его в любом месте - вы просто устанавливают selector как action для кнопки. Ожидается, что этот селектор будет иметь форму - (void)foo:(id)sender, ....

Вместо этого вы можете использовать словарь, например. тег как ключ, который сопоставляется с определенным NSInvocation или хранит дополнительные аргументы.

+0

Так вы имеете в виду, что единственный способ отправить несколько аргументов на нажатие кнопки должен использовать объект коллекции (словарь, массив и т. д.), так как они всегда будут принимать только один аргумент? – Amarsh

+0

@Amarsh: Я имею в виду, что вы не можете использовать incovations и др. Здесь, а вместо этого должны хранить информацию и отношение к кнопке в другом месте. –

+0

@George: Да, спасибо. Ваш комментарий помог мне решить мою проблему. Thans для этого. – Amarsh

1

Я решил это по-другому. Subclassed UIButton и добавил все необходимые мне свойства. Это как класс выглядит следующим образом:

@interface RecentSalePropertyDetailsButton : UIButton { 
    Property* property; 
} 
@property (nonatomic, retain) Property* property; 
@end 
@implementation RecentSalePropertyDetailsButton 
@synthesize property; 
- (id) initWithPropertyAs:(Property*)aProperty{ 
    [super init]; 
    self.property = aProperty; 
    return self; 
} 
@end 

Затем, далее вниз, я следующее:

// allocate the details button's action 
    RecentSalePropertyDetailsButton* button = (RecentSalePropertyDetailsButton *)[myView viewWithTag:15]; 
    button.property = property; 
    [button addTarget:self action:@selector(showRecentSalesPropertyDetails:) forControlEvents:UIControlEventTouchDown]; 
0
//make a button 
    UIButton *button = [UIButton buttonWithType:0]; 
//set button size 
    button.frame = CGRectMake(20,219,280,106); 
//give it a color 
    button.backgroundColor = [UIColor clearColor]; 
//add a method 
    [button addTarget:self action:@selector(cancel) forControlEvents:UIControlEventTouchUpInside]; 
//add it to the currentview 
    [self.view addSubview:button];