Hanya ingin tahu, karena sepertinya tidak segera, tetapi apakah ada cara licik untuk memanfaatkan kelas iOS 6 baru UIRefreshControl
tanpa menggunakan UITableViewController
subkelas?
Saya sering menggunakan UIViewController
dengan UITableView
subview dan menyesuaikan diri UITableViewDataSource
dan UITableViewDelegate
bukannya menggunakan UITableViewController
outright.
UITableViewController
dan mengajukan bug meminta API untuk menggunakanUIRefreshControl
dengan secaraUITableView
langsung.Jawaban:
Pada firasat, dan berdasarkan inspirasi DrummerB, saya mencoba hanya menambahkan
UIRefreshControl
contoh sebagai subview ke sayaUITableView
. Dan secara ajaib itu hanya bekerja!Ini menambahkan tampilan
UIRefreshControl
tabel di atas Anda dan berfungsi seperti yang diharapkan tanpa harus menggunakanUITableViewController
:)EDIT: Ini di atas masih berfungsi tetapi karena beberapa telah menunjukkan, ada sedikit "gagap" ketika menambahkan UIRefreshControl dengan cara ini. Solusi untuk itu adalah dengan instantiate UITableViewController, dan kemudian setting UIRefreshControl dan UITableView Anda untuk itu, yaitu:
sumber
-[UITableViewController setRefreshControl:]
) akan terus berfungsi.handleRefresh:
ada perubahan tak terduga dalam nilai tampilan gulircontentInsets
selama sepersekian detik. Adakah orang lain yang mengalami atau memperbaiki ini? (yup, saya tahu ini tidak didukung sejak awal!)UITableViewController
Anda dan Anda akan "melakukannya dengan benar".[_tableView insertSubview:_refreshControl atIndex:0];
. Diuji dengan iOS 7 dan 8;)Untuk menghilangkan gagap yang disebabkan oleh jawaban yang diterima, Anda dapat menugaskan Anda
UITableView
untuk aUITableViewController
.EDIT:
Cara untuk menambahkan
UIRefreshControl
tanpaUITableViewController
tanpa gagap dan mempertahankan animasi yang bagus setelah menyegarkan data di tampilan tabel.Kemudian ketika menangani data yang di-refresh ...
sumber
[_tablewViewController didMoveToParentViewController:self];
setelah menambahkan subview.self.tableView = _tableViewController.tableView;
seharusnya_tableViewController.tableView = self.tableView
Apa yang akan Anda coba adalah menggunakan tampilan wadah di dalam ViewController yang Anda gunakan. Anda dapat mendefinisikan subclass UITableViewController yang bersih dengan tampilan tabel khusus dan menempatkannya di ViewController.
sumber
self.childViewControllers.firstObject
.prepareForSegue
untuk mendapatkan referensi ke objek UITableViewController dalam tampilan wadah karena ini segera dipicu sebagai peristiwa segue pada instantiasi dari storyboard.Yah UIRefreshControl adalah subkelas UIView, jadi Anda bisa menggunakannya sendiri. Saya tidak yakin bagaimana cara menerjemahkannya sendiri. Render bisa bergantung pada frame, tetapi juga bisa bergantung pada UIScrollView atau UITableViewController.
Apa pun itu, ini akan lebih merupakan peretasan daripada solusi yang elegan. Saya sarankan Anda melihat ke salah satu klon pihak ke-3 yang tersedia atau menulis sendiri.
ODRefreshControl
SlimeRefresh
sumber
Coba tunda panggilan ke
-endRefresh
metode refreshControl dengan sepersekian detik setelah tableView memuat kembali isinya, baik dengan menggunakan NSObject-performSelector:withObject:afterDelay:
atau GCDdispatch_after
.Saya membuat kategori di UIRefreshControl untuk ini:
Saya mengujinya dan ini juga berfungsi pada Tampilan Koleksi. Saya perhatikan bahwa penundaan sekecil 0,01 detik sudah cukup:
sumber
UIRefreshControl
.[self performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.01]
-performSelector:withObject:afterDelay:
atau GCD untuk ini adalah masalah selera pribadi.itu mudah
Jika Anda ingin belajar tentang iOS 10 UIRefreshControl baca di sini .
sumber
Menambahkan kontrol penyegaran sebagai subview menciptakan ruang kosong di atas header bagian.
Sebagai gantinya, saya menyematkan UITableViewController ke dalam UIViewController saya, lalu mengubah
tableView
properti saya untuk mengarah ke yang tertanam, dan biola! Perubahan kode minimal. :-)Langkah:
@IBOutlet weak var tableView: UITableView!
dengan yang dari UITableViewController yang baru tertanam, seperti yang ditunjukkan di bawah inisumber
Untuk Swift 2.2.
Pertama buat UIRefreshControl ().
Dalam metode viewDidLoad () Anda tambahkan:
Dan buat fungsi refresh
sumber
Inilah solusi lain yang sedikit berbeda.
Saya harus menggunakannya karena beberapa masalah hierarki tampilan yang saya miliki: Saya sedang membuat beberapa fungsi yang mengharuskan melewati tampilan di sekitar ke berbagai tempat dalam hierarki tampilan, yang rusak ketika menggunakan tampilan tabel UITableViewController b / c tableView adalah tampilan root UITableViewController's ( self.view) dan bukan hanya tampilan biasa, itu menciptakan hierarki controller / view yang tidak konsisten dan menyebabkan crash.
Pada dasarnya buatlah subkelas Anda sendiri dari UITableViewController dan atur loadView untuk menetapkan sendiri. Lihat tampilan yang berbeda, dan ganti properti tableView untuk mengembalikan tampilan tabel yang terpisah.
sebagai contoh:
Ketika dikombinasikan dengan solusi Keller, ini akan lebih kuat dalam arti bahwa tableView sekarang menjadi tampilan biasa, bukan tampilan root VC, dan lebih kuat terhadap perubahan hierarki tampilan. Contoh menggunakannya dengan cara ini:
Ada kemungkinan penggunaan lain untuk ini:
Karena subklas dengan cara ini memisahkan self.view dari self.tableView, sekarang mungkin untuk menggunakan UITableViewController ini sebagai pengontrol biasa, dan menambahkan subview lain ke self.view tanpa keanehan menambahkan subview ke UITableView, jadi orang mungkin mempertimbangkan untuk membuat lihat pengontrol secara langsung subkelas UITableViewController alih-alih memiliki anak-anak UITableViewController.
Beberapa hal yang harus diperhatikan:
Karena kita mengganti properti tableView tanpa memanggil super, mungkin ada beberapa hal yang harus diperhatikan dan harus ditangani jika perlu. Sebagai contoh, mengatur tampilan tabel dalam contoh saya di atas tidak akan menambahkan tampilan tabel ke self.view dan tidak mengatur bingkai yang mungkin ingin Anda lakukan. Juga, dalam implementasi ini tidak ada tableView default yang diberikan kepada Anda ketika kelas instantiated, yang juga merupakan sesuatu yang dapat Anda pertimbangkan untuk ditambahkan. Saya tidak memasukkannya di sini karena itu adalah kasus per kasus, dan solusi ini sebenarnya cocok dengan solusi Keller.
sumber
Coba ini,
Solusi di atas baik-baik saja tetapi tableView.refreshControl hanya tersedia untuk UITableViewController, hingga iOS 9.x dan masuk dalam UITableView dari iOS 10.x dan seterusnya.
Ditulis dalam Swift 3 -
sumber
Saran pertama Keller menyebabkan bug aneh di iOS 7 di mana inset tabel meningkat setelah pengontrol tampilan muncul kembali. Mengubah ke jawaban kedua, menggunakan uitableviewcontroller, memperbaiki beberapa hal untuk saya.
sumber
Ternyata Anda dapat menggunakan yang berikut saat Anda menggunakan UIViewController dengan subview UITableView dan menyesuaikan dengan UITableViewDataSource dan UITableViewDelegate:
sumber
self.refreshControl
adalah properti untukUITableViewController
, bukan aUIViewController
.