2

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

现在,我在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通知。

4

1 回答 1

0

UITableViewDelegate是 的延伸UIScrollViewDelegate。您可以实现其中一种UIScrollViewDelegate方法并使用它来确定何时取消选择该行。scrollViewDidEndDecelerating:似乎是一个不错的起点。

performSelector...此外,由于 1 参数限制,我个人发现方法受到限制。我更喜欢使用 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];
});

}

于 2012-05-11T10:41:50.840 回答