我正在尝试做动画。在某些时候,我想通过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;
}
答案 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