2

UITableViewCell触れたときに閉じて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ます。アプリに戻った後、1 ~ 2 秒間、強調表示された状態のままになります。

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 に答える