Pertanyaan didSelectRowAtIndexPath mengembalikan IndexPath yang salah


Saya telah menemukan bug yang sangat membingungkan. Itu pertama baris dari UITableView saya kembali 1 dan kedua satu kembali 0 di indexPath! Bagaimana itu mungkin?

Dalam `- (void) viewDidLoad` semuanya masih baik-baik saja. Saya menyoroti baris pertama berhasil dengan

currentRow = 0;
[tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:currentRow inSection:0] 
  animated:NO scrollPosition:UITableViewScrollPositionNone];

Saya memiliki variabel currentRow untuk melacak baris mana yang dipilih (kontrol lain berubah sesuai dengan yang dipilih saat ini).

Sekarang dalam fungsi delegasi `didDeselectRowAtIndexPath` saya punya:

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
...
NSLog(@"IndexPath: %@", [indexPath description]);
}

Log menunjukkan hal-hal berikut:

IndexPath: <NSIndexPath 0x79509d0> 2 indexes [0, 0] ketika saya menyentuh kedua baris, dan IndexPath: <NSIndexPath 0x79509d0> 2 indexes [0, 1] ketika saya menyentuh pertama baris.

Tidak ada baris penyisipan atau penghapusan atau penyortiran, dll, bahkan tidak bergulir. Ini adalah UITableView sederhana, gaya yang dikelompokkan, dengan 1 bagian dan 3 baris. Apa yang menyebabkan ini?

Terima kasih atas bantuan Anda,
S


69
2017-11-07 18:14


asal


Jawaban:


Anda telah menerapkan melakukanDeselectRowAtIndexPath. Ini akan diaktifkan ketika baris itu tidak lagi dipilih.

Saat Anda menyentuh baris kedua, baris pertama adalah tidak lagi dipilih, jadi [0, 1] akan ditampilkan.
Saat Anda menyentuh baris pertama lagi, baris kedua sekarang tidak lagi dipilih, jadi [0, 0] akan ditampilkan.

Ini benar-benar diharapkan.

Melaksanakan melakukanMemilihRowAtIndexPath jika Anda membutuhkannya untuk menanggapi ketika baris itu terpilih.

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

    NSLog(@"IndexPath: %@", [indexPath description]);
}

227
2017-11-07 18:20



Meskipun judul, metode kelebihan beban sebenarnya didDeselectRowAtIndexPath, sehingga terdengar seperti perilaku benar - ketika baris ke-1 disentuh, ke-0 menjadi tidak terpilih, dan sebaliknya.


3
2017-11-07 18:24