Pilih baris tampilan tabel secara terprogram

136

Bagaimana cara saya memilih UITableViewbaris programatis sehingga

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

dieksekusi? selectRowAtIndexPathhanya akan menyorot baris tersebut.

4thSpace
sumber
Saya mengalami masalah yang sama dan baik-baik saja tautannya: stackoverflow.com/questions/5324501/… Saya harap ini akan membantu Anda.
michael

Jawaban:

110

Dari dokumentasi referensi:

Memanggil metode ini tidak menyebabkan delegasi menerima pesan tableView:willSelectRowAtIndexPath:atau tableView:didSelectRowAtIndexPath:, juga tidak mengirimkan UITableViewSelectionDidChangeNotificationpemberitahuan kepada pengamat.

Yang akan saya lakukan adalah:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self doSomethingWithRowAtIndexPath:indexPath];
}

Dan kemudian, dari tempat Anda ingin memanggil selectRowAtIndexPath, Anda memanggil doSomethingWithRowAtIndexPath. Selain itu, Anda juga dapat memanggil selectRowAtIndexPath jika Anda ingin umpan balik UI terjadi.

Jaanus
sumber
4
Atau ketika Anda memilih baris secara terprogram, Anda dapat memanggil tableView: didSelectRowAtIndexPath: yourself (di kelas yang telah Anda hubungkan sebagai delegasi).
Kendall Helmstetter Gelner
3
Metode ini tampak seperti retasan bagi saya, itu memang menyelesaikan pekerjaan tetapi saya pikir harus ada cara yang lebih baik untuk melakukannya.
Tapan Thaker
1
Saya tidak benar-benar berpikir Anda perlu membuat panggilan "doSomethingWithRowAtIndexPath" tidak bisakah Anda memanggil metode delegasi dan meneruskan argumen yang Anda butuhkan untuk menjalankan logika didSelect dari tempat Anda menerapkan metode delegasi?
ImpactZero
112

Seperti yang dikatakan Jaanus:

Memanggil metode (-selectRowAtIndexPath: animated: scrollPosition :) ini tidak menyebabkan delegasi menerima tableView: willSelectRowAtIndexPath: atau tableView: didSelectRowAtIndexPath: message, juga tidak akan mengirim pemberitahuan UITableViewSelectionDidChangeNotification ke pengamat.

Jadi, Anda hanya perlu memanggil delegatemetode itu sendiri.

Sebagai contoh:

Versi Swift 3:

let indexPath = IndexPath(row: 0, section: 0);
self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
self.tableView(self.tableView, didSelectRowAt: indexPath)

Versi ObjectiveC:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath 
                            animated:YES 
                      scrollPosition:UITableViewScrollPositionNone];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];

Versi Swift 2.3:

 let indexPath = NSIndexPath(forRow: 0, inSection: 0);
 self.tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
 self.tableView(self.tableView, didSelectRowAtIndexPath: indexPath)
Dulgan
sumber
63

UITableView ini selectRowAtIndexPath: animasi: scrollPosition: harus melakukan trik.

Cukup berikan UITableViewScrollPositionNonescrollPosition dan pengguna tidak akan melihat gerakan apa pun.


Anda juga harus dapat menjalankan tindakan secara manual:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

setelah Anda selectRowAtIndexPath:animated:scrollPosition:jadi sorotan terjadi serta logika terkait.

anq
sumber
Maaf, itu yang saya gunakan. Saya tidak sengaja meletakkan scrollToRowAtIndexPath. Saya telah memperbarui pertanyaan tersebut. scrollToRowAtIndexPath hanya menyoroti sel.
4thSpace
2
Ya, maaf. Ia mengatakan itu tidak akan mengaktifkan didSelectRowAtIndexPath tepat di sana di tautan dokumen yang saya posting. Saya perlu belajar membaca.
anq
@anq: Terima kasih banyak! Ini membantu saya ketika saya memanggil didSelectRowAtIndexPath: indexPath di sel kustom.
Bentley
21

jika Anda ingin memilih beberapa baris, ini akan membantu Anda

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[someTableView selectRowAtIndexPath:indexPath 
                           animated:NO 
                     scrollPosition:UITableViewScrollPositionNone];

Ini juga akan menyoroti baris tersebut. Kemudian delegasikan

 [someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];
Nazir
sumber
18

Solusi Cepat 3/4/5

Pilih Baris

let indexPath = IndexPath(row: 0, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)

Batalkan Pilihan Baris

let deselectIndexPath = IndexPath(row: 7, section: 0)
tblView.deselectRow(at: deselectIndexPath, animated: true)
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)
Sourabh Sharma
sumber
Bagi saya, menambahkan '.delegate?' adalah kuncinya. (Swift 4.5)
KoreanXcodeWorker
4

Ada dua metode berbeda untuk platform iPad dan iPhone, jadi Anda perlu menerapkan keduanya:

  • penangan seleksi dan
  • segue.

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    
    // Selection handler (for horizontal iPad)
    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    
    // Segue (for iPhone and vertical iPad)
    [self performSegueWithIdentifier:"showDetail" sender:self];
    
Alexander Volkov
sumber
3

Gunakan kategori ini untuk memilih baris tabel dan menjalankan urutan tertentu setelah penundaan.
Panggil ini dalam viewDidAppearmetode Anda :

[tableViewController delayedSelection:withSegueIdentifier:]


@implementation UITableViewController (TLUtils)

-(void)delayedSelection:(NSIndexPath *)idxPath withSegueIdentifier:(NSString *)segueID {
    if (!idxPath) idxPath = [NSIndexPath indexPathForRow:0 inSection:0];                                                                                                                                                                 
    [self performSelector:@selector(selectIndexPath:) withObject:@{@"NSIndexPath": idxPath, @"UIStoryboardSegue": segueID } afterDelay:0];                                                                                               
}

-(void)selectIndexPath:(NSDictionary *)args {
    NSIndexPath *idxPath = args[@"NSIndexPath"];                                                                                                                                                                                         
    [self.tableView selectRowAtIndexPath:idxPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];                                                                                                                            

    if ([self.tableView.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)])
        [self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:idxPath];                                                                                                                                              

    [self performSegueWithIdentifier:args[@"UIStoryboardSegue"] sender:self];                                                                                                                                                            
}

@end
Jonathan Kolyer
sumber
2
Pertanyaan itu tidak ada hubungannya dengan segues.
delete_user
Ya, tidak ada dalam jawaban Anda yang terkait dengan pertanyaan
dulgan
2
Hargai jawaban ini. Ini berfungsi dengan sempurna jika pengguna ingin mencapai perilaku yang sama tetapi menggunakan papan cerita.
Bijoy Thangaraj