2

UITableViewCell我有一个应用程序在触摸a 时关闭并转到 Safari 打开 URL 。但是,当我返回应用程序时,仍会选择该单元格几秒钟。为什么不立即取消选择?它是一个错误吗?这是代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    if (indexPath.section == 0 && indexPath.row == 0) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.example.com/"]];
    }

}

我尝试移动[tableView deselectRowAtIndexPath:indexPath animated:NO];到顶部并关闭动画,但没有帮助。这没什么大不了的,但如果可能的话,我希望它立即取消选择。

这也发生UIButton了。返回应用程序后,它会保持突出显示状态一两秒。

4

1 回答 1

5

诸如此类的更改[tableView deselectRowAtIndexPath:indexPath animated:NO];会在运行循环的下一次迭代中生效。当您退出时openURL:,会延迟下一次迭代,直到您切换回应用程序。切换回来是通过在您离开之前在屏幕图像中循环来实现的,然后片刻之后使应用程序再次交互。因此,所选图像仍然存在。

抛开实现的细节,逻辑是影响屏幕内容的东西被捆绑在一起并被原子化,这样当你进行视图调整时,你就不必总是想‘哦,不,如果框架现在重绘怎么办并且只完成到这里的更改?'。根据 iOS 多任务模型,在您返回应用程序之前不会发生调整界面的原子单元。

快速解决:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // deselect right here, right now
    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    if (indexPath.section == 0 && indexPath.row == 0) {
        [[UIApplication sharedApplication]
                    performSelector:@selector(openURL:)
                    withObject:[NSURL URLWithString:@"http://www.example.com/"]
                    afterDelay:0.0];

        /*
              performSelector:withObject:afterDelay: schedules a particular
              operation to happen in the future. A delay of 0.0 means that it'll
              be added to the run loop's list to occur as soon as possible.

              However, it'll occur after any currently scheduled UI updates
              (such as the net effect of a deselectRowAtIndexPath:...)
              because that stuff is already in the queue.
        */
    }

}
于 2012-08-23T20:12:13.533 回答