2010-12-29 8 views
5

Как вы вызываете метод @selector с несколькими аргументами?@selector с несколькими аргументами

У меня есть следующий

[self performSelector:@selector(changeImage:withString:) withObject:A1 withObject:fileString2 afterDelay:0.1]; 

но получить непризнанным селектор

послал к примеру

ошибка

Мой метод я называю это следующим образом

-(void) changeImage: (UIButton *) button withString: (NSString *) string 
{ 
[button setImage:[UIImage imageNamed:string] forState:UIControlStateNormal]; 
} 

ответ

18

Вы должны использовать NSInvocation

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: 
          [self methodSignatureForSelector:@selector(changeImage:withString:)]]; 
[invocation setTarget:self]; 
[invocation setSelector:@selector(changeImage:withString:)]; 
[invocation setArgument:A1 atIndex:2]; 
[invocation setArgument:fileString2 atIndex:3]; 
[NSTimer scheduledTimerWithTimeInterval:0.1f invocation:invocation repeats:NO]; 
+0

Прохладный, спасибо. Как мне это назвать. Я хочу назвать это во многих местах. Так может ли быть объявлено в методе viewDidLoad, а затем вызываться в разных местах? – jarryd

+0

Я не совсем понимаю, что вы имеете в виду. Вы можете поместить этот фрагмент кода в любом месте класса, где определяется changeImage: withString:. Если вы хотите вызвать его несколько раз, вы должны обернуть его в метод и вместо этого вызвать этот метод. – Jilouc

+1

поочередно, вы можете сделать '[invocation performSelector: @selector (invoke) withObject: nil afterDelay: 0.1];' – user102008

0

Вы вызываете performSelector:withObject:withObject:afterDelay:, но этот метод не существует.

Ваш единственный вариант: performSelector:withObject:withObject:, но вы не можете указать задержку с этим методом. Если вам нужна задержка, вам, вероятно, придется создать категорию для NSObject и создать новый метод самостоятельно.

4

NSObject класс имеет метод performSelector:withObject:afterDelay:, а протокол NSObject определяет метод performSelector:withObject:withObject:, но нигде нет указан performSelector:withObject:withObject:afterDelay:.

В этом случае вам необходимо использовать NSInvocation, чтобы получить желаемую функциональность. Настройте вызов, а затем вы можете позвонить performSelector:withObject:afterDelay по самому вызову, используя селектор invoke и объект nil.

1

Это не лучший способ, чтобы обойти его, но если вы хотите, вы можете изменить метод, чтобы принять NSArray, когда объект с индексом 0 кнопка и на index 1 - строка.

3

Отсутствует способ выполнения селектора с несколькими аргументами и задержка. Вы можете обернуть кнопку и объект строки в NSDictionary, чтобы обойти эту проблему следующим образом:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:A1,@"button",fileString2,@"string",nil]; 
[self performSelector:@selector(changeWithDict:) withObject:dict afterDelay:0.1]; 
//... 

-(void)changeWithDict:(NSDictionary *)dict { 
    [[dict objectForKey:@"button"] setImage:[UIImage imageNamed:[dict objectForKey:@"string"]] forState:UIControlStateNormal]; 
} 
2

Если вы ориентируетесь IOS 4.0+ вы могли бы использовать блоки. Что-то вроде этого должно сделать трюк.

// Delay execution of my block for 0.1 seconds. 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, USEC_PER_SEC/10ull), dispatch_get_current_queue(), ^{ 
    [self changeImage:A1 withString:fileString2]; 
}); 
+0

Я буду помнить об этом, но я настроен с 3,0. – jarryd

+0

В этом случае вам необходимо использовать метод NSInvocation, предоставленный другими. Блоки были введены только в iOS 4.0. – extremeboredom

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