NSTImer и отправка аргументов через селектор - PullRequest
0 голосов
/ 05 июля 2011

Я пытаюсь сделать анимацию.В какой-то момент я хочу выполнить метод через NSTimer.Мне нужно передать в 1 аргумент.Это я делаю это через userInfo в NSTimer.В методе селектора я пытаюсь получить доступ к этому переданному аргументу.Но когда я действительно запускаю это, я получаю следующее исключение.Это говорит неверный аргумент.Что я делаю не так?

"Завершение приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: '- [FLOViewController hideCellView ]: нераспознанный селектор отправлен в экземпляр 0x1681d0'"

-(void)hideCellView:(NSTimer *)timer
{
    UITableViewCell *cellView = (UITableViewCell *)[timer userInfo];
    [cellView addSubview:self.extrasView];
    return;
}

-(IBAction)showExtras:(id)sender
{
    if(![sender isKindOfClass: [UIButton class]]) return;  // be paranoid
    self.searchResTable.scrollEnabled = NO;

    //Get the exact cell where the click happened
    UIButton *button          = sender; 
    CGPoint correctedPoint    = [button convertPoint:button.bounds.origin toView:self.searchResTable]; 
    NSIndexPath *indexPath    = [self.searchResTable indexPathForRowAtPoint:correctedPoint];
    UITableViewCell *cellView = [self.searchResTable cellForRowAtIndexPath:indexPath];

    //now run animation
    CGContextRef context      = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft 
                           forView:cellView 
                             cache:YES];
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    [UIView setAnimationDuration:1];
    [NSTimer scheduledTimerWithTimeInterval:0.5 
                                     target:self 
                                   selector:@selector(hideCellView) 
                                   userInfo:cellView 
                                    repeats:NO];
    [UIView commitAnimations];
    return;
}

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Быстрый ответ - заменить строку [NSTimer scheduledTimerWithTimeInterval ... на:

[self performSelector:@selector(hideCellView:) withObject:cellView afterDelay:0.5]

Но это не правильный способ обработки выполняющегося кода после анимации.Проверьте анимацию на основе блоков, используя что-то вроде animateWithDuration:animations:completion:. Документация Apple - хорошее место для начала .

1 голос
/ 05 июля 2011

Вы передали неправильный селектор.

selector:@selector(hideCellView) 

Так и должно быть,

selector:@selector(hideCellView:) 

При этом вам следует рассмотреть возможность отправки пути индекса ячейки табличного представления, а не самой ячейки, поскольку ячейки используются повторно. Ячейку можно получить позже, используя метод cellForRowAtIndexPath: для представления таблицы в методе hideCellView:.

Если вы хотите установить задержку анимации, используйте метод setAnimationDelay:, а не NSTimer.

...