NSTImer&通过选择器发送args

时间:2011-07-05 06:15:06

标签: ios objective-c exception selector nstimer

我正在尝试做动画。在某些时候,我想通过NSTimer执行一个方法。我需要传递1个参数。我是通过userInfo中的NSTimer来完成的。在选择器方法中,我试图访问这个传递的arg。但是当我实际运行它时,我得到以下异常。它说无效的论点。我做错了什么?

  

“因未捕获而终止应用   例外   '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 个答案:

答案 0 :(得分:1)

你传递了错误的选择器。

selector:@selector(hideCellView) 

应该是,

selector:@selector(hideCellView:) 

那就是说你应该考虑发送表视图单元的索引路径而不是单元本身,因为单元被重用了。您可以稍后使用cellForRowAtIndexPath:方法在hideCellView:方法中使用setAnimationDelay:方法获取单元格。

如果您希望在动画中设置延迟,请使用NSTimer方法,而不是使用{{1}}。

答案 1 :(得分:1)

快速回答是将[NSTimer scheduledTimerWithTimeInterval ...行替换为:

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

但这不是处理动画后运行代码的正确方法。使用类似animateWithDuration:animations:completion:的内容检查基于块的动画。 Apple docs are a good place to start