将表格视图滚动到单元格,然后刷新单元格

时间:2012-05-11 10:34:38

标签: iphone objective-c cocoa-touch uitableview selection

我有一个包含许多单元格的表格视图。当我添加一个新单元格(使用模态视图控制器)时,我想向用户显示新添加的单元格。为此,我想将表格视图滚动到新单元格,选择它并立即取消选择它。

现在,我在一段时间间隔之后向我的表格视图发送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通知。

1 个答案:

答案 0 :(得分:0)

UITableViewDelegateUIScrollViewDelegate的扩展。您可以实现其中一个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];
});

}