Sayangnya metode itu tidak dipanggil kecuali tipe tombol internal yang disediakan saat Anda menggunakan salah satu tipe yang telah ditentukan diketuk. Untuk menggunakan milik Anda sendiri, Anda harus membuat aksesori sebagai tombol atau subkelas UIControl lainnya (saya akan merekomendasikan tombol menggunakan -buttonWithType:UIButtonTypeCustom
dan mengatur gambar tombol, daripada menggunakan UIImageView).
Berikut adalah beberapa hal yang saya gunakan dalam Outpost, yang mengkustomisasi cukup dari widget standar (hanya sedikit, untuk mencocokkan pewarnaan teal kami) yang akhirnya saya lakukan dengan menggunakan subclass perantara UITableViewController saya sendiri untuk menyimpan kode utilitas untuk semua tampilan tabel lain untuk digunakan (mereka sekarang subklas OPTableViewController).
Pertama, fungsi ini mengembalikan tombol pengungkapan detail baru menggunakan grafik khusus kami:
- (UIButton *) makeDetailDisclosureButton
{
UIButton * button = [UIButton outpostDetailDisclosureButton];
[button addTarget: self
action: @selector(accessoryButtonTapped:withEvent:)
forControlEvents: UIControlEventTouchUpInside];
return ( button );
}
Tombol akan memanggil rutin ini setelah selesai, yang kemudian mengumpankan rutin UITableViewDelegate standar untuk tombol aksesori:
- (void) accessoryButtonTapped: (UIControl *) button withEvent: (UIEvent *) event
{
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: [[[event touchesForView: button] anyObject] locationInView: self.tableView]];
if ( indexPath == nil )
return;
[self.tableView.delegate tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath];
}
Fungsi ini menempatkan baris dengan mendapatkan lokasi dalam tampilan tabel dari sentuhan dari acara yang disediakan oleh tombol dan meminta tampilan tabel untuk jalur indeks baris pada saat itu.
self.tableView
. bagaimana jika Anda tidak tahu tampilan tabel mana yang berisi baris?Saya menemukan situs web ini sangat membantu: tampilan aksesori khusus untuk uitableview Anda di iphone
Singkatnya, gunakan ini di
cellForRowAtIndexPath:
:kemudian, terapkan metode ini:
sumber
Pendekatan saya adalah membuat
UITableViewCell
subclass dan merangkum logika yang akan memanggil metode biasaUITableViewDelegate
di dalamnya.sumber
button.superview
,cell.superview
dan[tableView.delegate tableView:...]
tidak cukup aman.Perpanjangan jawaban Jim Dovey di atas:
Hati-hati saat Anda menggunakan UISearchBarController dengan UITableView Anda. Dalam hal ini Anda ingin memeriksa
self.searchDisplayController.active
dan menggunakanself.searchDisplayController.searchResultsTableView
alih-alihself.tableView
. Kalau tidak, Anda akan mendapatkan hasil yang tidak terduga ketika searchDisplayController aktif, terutama ketika hasil pencarian digulir.Sebagai contoh:
sumber
Tetapkan makro untuk tag tombol:
Buat tombol dan atur cell.accessoryView saat membuat sel
Setel cell.accessoryView.tag dengan indexPath di metode UITableViewDataSource -tableView: cellForRowAtIndexPath:
Penangan acara untuk tombol
Terapkan metode UITableViewDelegate
sumber
tag
kecuali jika mutlak diperlukan, mencari solusi lain.Ketika tombol diketuk, Anda dapat memanggil metode berikut di dalam subkelas UITableViewCell
sumber
Dengan pendekatan yanchenko saya harus menambahkan:
[accBtn setFrame:CGRectMake(0, 0, 20, 20)];
Jika Anda menggunakan file xib untuk menyesuaikan tableCell Anda, maka initWithStyle: reuseIdentifier: tidak akan dipanggil.
Alih-alih menimpa:
sumber
Anda harus menggunakan a
UIControl
untuk mendapatkan pengiriman acara dengan benar (misalnya aUIButton
) alih-alih sederhanaUIView/UIImageView
.sumber
Cepat 5
Pendekatan ini menggunakan
UIButton.tag
untuk menyimpan indexPath menggunakan bit-shifting dasar. Pendekatan ini akan bekerja pada sistem 32 & 64 bit selama Anda tidak memiliki lebih dari 65535 bagian atau baris.sumber
Pada iOS 3.2 Anda dapat menghindari tombol yang direkomendasikan oleh orang lain di sini dan sebagai gantinya menggunakan UIImageView Anda dengan pengenal isyarat ketukan. Pastikan untuk mengaktifkan interaksi pengguna, yang dinonaktifkan secara default di UIImageViews.
sumber