2013-03-28 2 views
0

В моем приложении у меня есть анимация, которая прокручивается по экрану. Моя проблема в том, что когда я использую @selector для вызова моей анимации, поток падает.`Непризнанный селектор отправлен в экземпляр

Если я использую тот же @selector для вызова другой функции на моей странице, она отлично работает, но при вызове этой функции она не работает. Если я поместил свой код в раздел viewDidLoad, он отлично работает.

Я пробовал довольно много из этих ссылок для unrecognized selector sent to instance в Stackoverflow, но ничего не помогло. Я также попытался - (void)imageSpawn вместо - (void) imageSpawn:(id)sender withEvent:(UIEvent *) события и изменить селектор (imageSpawn) вместо `(ImageSpawn :) еще не повезло ....

- (void)viewDidLoad { 

    [self performSelector:@selector(imageSpawn:) withObject:nil afterDelay:3]; 
} 

- (void) imageSpawn:(id) sender withEvent:(UIEvent *) event 
{ 

    UIImage* image = [UIImage imageNamed:@"ae"]; 
    UIImageView *rocket = [[UIImageView alloc] initWithImage:image]; 
    rocket.frame = CGRectMake(-25, 200, 25, 40); 
    [UIView animateWithDuration:5 animations:^(){rocket.frame=CGRectMake(345, 200, 25, 40);} completion:^(BOOL finished){if (finished){ 

      //trigger an event. 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Tapped row!" 
                  message:[NSString stringWithFormat:@"Shot"] 
                  delegate:nil 
               cancelButtonTitle:@"Yes, I did!" 
               otherButtonTitles:nil]; 
      [alert show]; 
     } 
    }]; 
    [myScrollView addSubview:rocket]; 
} 



2013-03-28 10:14:31.661 shotplacementgiude001[16897:c07] -[SelectedCellViewController imageSpawn:]: unrecognized selector sent to instance 0xa159480 
2013-03-28 10:14:31.663 shotplacementgiude001[16897:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SelectedCellViewController imageSpawn:]: unrecognized selector sent to instance 0xa159480' 
*** First throw call stack: 
(0x16b4012 0x13c1e7e 0x173f4bd 0x16a3bbc 0x16a394e 0xdbf5b3 0x1673376 0x1672e06 0x165aa82 0x1659f44 0x1659e1b 0x27157e3 0x2715668 0x305ffc 0x2c3d 0x2b65 0x1) libc++abi.dylib: terminate called throwing an exception 
(lldb) 
+0

На самом деле ответ peko (теперь удален) был совершенно верным, вы не можете использовать 'performSelector: withObject: afterDelay:' для методов с двумя аргументами. –

ответ

1
- (void)viewDidLoad 
{ 
    [self performSelector:@selector(imageSpawn:withEvent:) withObject:nil withObject:nil]; 
} 

Ваш метод Defination содержит два параметра - (void) imageSpawn:(id) sender withEvent:(UIEvent *) event, так что вам нужно метод вызова с двумя параметрами в селекторе.

ПРИМЕЧАНИЕ

Если вы хотите передать два объекта селектор, то другой метод доступен, который performSelector:withObject:withObject:

который посылает сообщение на приемник с двумя объектами в качестве аргументов.

Пример

[self performSelector:@selector(imageSpawn:withEvent:) withObject:senderObject withObject:eventObject]; 

Так в идеале вы должны использовать выше метод для двух параметров разбора или инкапсулировать данные, которые вы хотите отправить вместе в какой-либо одной цели объекта C (например, NSArray, NSDictionary, некоторые пользовательские Цель тип с), а затем передать его через примера [NSObject performSelector:withObject:afterDelay:]

NSDictionary *dictionary = [[NSDictionary alloc] init]; 
[dictionary setObject:senderObject forKey:@"sender"]; 
[dictionary setObject:eventObject forKey:@"event"]; 
[self performSelector:@selector(imageSpawn:withEvent:) withObject:dictionary afterDelay:3.0]; 
+0

Обратите внимание, что 'performSelector: withObject: afterDelay:' должен вызываться только для методов с нулевым или одним аргументом, поэтому это решение не совсем корректно (неопределенное поведение). –

2
- (void) imageSpawn:(id) sender withEvent:(UIEvent *) event 

представляет собой метод с 2 аргументами, и его селектор

@selector(imageSpawn:withEvent:) 

Однако

performSelector:withObject:afterDelay: 

должны быть использованы только с методами, которые имеют ноль или один аргумент. Таким образом, вы можете либо заменить метод,

- (void) imageSpawn:(id) sender 

и вызвать

[self performSelector:@selector(imageSpawn:) withObject:nil afterDelay:3]; 

или использовать методы НОД:

double delayInSeconds = 3.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    [self imageSpawn:nil withEvent:nil]; 
}); 

Преимущество гораздо лучше аргумент и тип проверки.

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