我有一个包含许多单元格的表格视图。当我添加一个新单元格(使用模态视图控制器)时,我想向用户显示新添加的单元格。为此,我想将表格视图滚动到新单元格,选择它并立即取消选择它。
现在,我在一段时间间隔之后向我的表格视图发送deselectRowAtIndexPath
:
- (IBAction)selectRow
{
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:7 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];
[self performSelector:@selector(deselectRow:) withObject:indexPath afterDelay:1.0f];
}
- (void)deselectRow:(NSIndexPath *)indexPath
{
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}
我想知道是否有更好的方法来做到这一点。它运行良好,但我不喜欢依赖静态计时器来执行有时需要不同时间的操作(例如,如果表格很长)。
修改:请注意,selectRowAtIndexPath:animated:scrollPosition
不会导致UITableView
委托方法被触发。不会调用tableView:didSelectRowAtIndexPath:
和scrollViewDidEndDecelerating:
。来自文档:
调用此方法不会导致代理收到
tableView:willSelectRowAtIndexPath:
或tableView:didSelectRowAtIndexPath:
消息,也不会向观察者发送UITableViewSelectionDidChangeNotification
通知。
答案 0 :(得分:0)
UITableViewDelegate
是UIScrollViewDelegate
的扩展。您可以实现其中一个UIScrollViewDelegate
方法,并使用它来确定何时取消选择该行。 scrollViewDidEndDecelerating:
似乎是一个很好的起点。
此外,由于1参数限制,我个人发现performSelector...
方法限制。我更喜欢使用GCD。代码如下所示:
- (IBAction)selectRow
{
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:7 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];
//deselect the row after a delay
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
});
}