Saya telah menyiapkan UIRefreshControl di UITableViewController saya (yang ada di dalam UINavigationController) dan berfungsi seperti yang diharapkan (yaitu, tarik ke bawah mengaktifkan peristiwa yang benar). Namun, jika saya secara terprogram menjalankan beginRefreshing
metode instance pada kontrol penyegaran seperti:
[self.refreshControl beginRefreshing];
Tidak ada yang terjadi. Ini harus bergerak ke bawah dan menampilkan pemintal. The endRefreshing
Metode bekerja dengan baik ketika saya sebut bahwa setelah refresh.
Saya membuat proyek prototipe dasar dengan perilaku ini dan berfungsi dengan baik ketika UITableViewController saya ditambahkan langsung ke pengontrol tampilan root delegasi aplikasi, misalnya:
self.viewController = tableViewController;
self.window.rootViewController = self.viewController;
Tetapi jika saya menambahkan tableViewController
ke UINavigationController terlebih dahulu, kemudian menambahkan pengontrol navigasi sebagai rootViewController
, beginRefreshing
metode tersebut tidak lagi berfungsi. Misalnya
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableViewController];
self.viewController = navController;
self.window.rootViewController = self.viewController;
Perasaan saya apakah ini ada hubungannya dengan hierarki tampilan bersarang dalam pengontrol navigasi yang tidak berfungsi baik dengan kontrol penyegar - ada saran?
Terima kasih
UITableViewController memiliki properti automaticAdjustsScrollViewInsets setelah iOS 7. Tampilan tabel mungkin sudah memiliki contentOffset, biasanya (0, -64).
Jadi, cara yang tepat untuk menampilkan refreshControl setelah pemrograman mulai memuat ulang adalah menambahkan tinggi refreshControl ke contentOffset yang ada.
sumber
-64
lebih baik digunakan-self.topLayoutGuide.length
Berikut ekstensi Swift menggunakan strategi yang dijelaskan di atas.
sumber
sendActionsForControlEvents(UIControlEvents.ValueChanged)
di akhir fungsi ini, jika tidak, logika logika penyegaran yang sebenarnya tidak akan dijalankan.Tidak ada jawaban lain yang berhasil untuk saya. Mereka akan menyebabkan pemintal muncul dan berputar, tetapi tindakan penyegaran itu sendiri tidak akan pernah terjadi. Ini bekerja:
Perhatikan, contoh ini menggunakan tampilan tabel, tetapi bisa juga merupakan tampilan koleksi.
sumber
SVPullToRefresh
, bagaimana cara menariknya ke bawah secara terprogram?[tableView triggerPullToRefresh];
" Lihat: github.com/samvermette/ SVPullToRefreshscrollView.contentOffset = CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height)
Pendekatan yang sudah disebutkan:
akan membuat pemintal terlihat. Tapi itu tidak akan bernyawa. Satu hal yang saya ubah adalah urutan kedua metode ini dan semuanya berfungsi:
sumber
Untuk Swift 4 / 4.1
Campuran jawaban yang ada melakukan pekerjaan untuk saya:
Semoga ini membantu!
sumber
Lihat juga pertanyaan ini
UIRefreshControl tidak menampilkan spiny saat memanggil beginRefreshing dan contentOffset adalah 0
Sepertinya bug bagi saya, karena ini hanya terjadi ketika properti contentOffset dari tableView adalah 0
Saya memperbaikinya dengan kode berikut (metode untuk UITableViewController):
sumber
beginRefreshing
, hanya statusnya yang berubah. Seperti yang saya lihat, ini mencegah untuk memulai tindakan penyegaran dua kali, sehingga mungkin pemuatan ulang yang disebut secara terprogram akan tetap berjalan, tindakan yang dimulai pengguna tidak akan memulai lagi.Ini adalah Swift 3 dan ekstensi yang lebih baru yang menampilkan spinner serta menganimasikannya.
sumber
asyncAfter
yang sebenarnya membuat animasi spinner bekerja (iOS 12.3 / Xcode 10.2)Ini bekerja sempurna untuk saya:
Cepat 3:
sumber
Untuk Swift 5, bagi saya satu-satunya hal yang hilang adalah menelepon
refreshControl.sendActions(.valueChanged)
. Saya membuat ekstensi agar lebih bersih.sumber
Selain solusi @Dymitry Shevchenko.
Saya menemukan solusi yang bagus untuk masalah ini. Anda dapat membuat ekstensi untuk
UIRefreshControl
metode timpa itu:Anda dapat menggunakan kelas baru dengan menyetel kelas khusus di Identity Inspector untuk kontrol penyegaran di Interface Builder.
sumber
Fort Swift 2.2+
sumber
Jika Anda menggunakan Rxswift untuk swift 3.1, bisa menggunakan di bawah ini:
Ini berfungsi untuk swift 3.1, iOS 10.
sumber
sendActions
pemicurx
yang membuat jawaban ini terkait denganRxSwift
jika ada yang bertanya-tanya pada pandangan pertamaself.tableView.setContentOffset(CGPoint(x:0, y:self.tableView.contentOffset.y - (refreshControl.frame.size.height)), animated: true)
diuji di Swift 5
gunakan ini di
viewDidLoad()
sumber
Saya menggunakan teknik yang sama untuk tanda visual show user "data is update". Pengguna yang membawa aplikasi dari latar belakang dan umpan / daftar akan diperbarui dengan UI seperti pengguna menarik tabel untuk menyegarkan dirinya sendiri. Versi saya berisi 3 hal
1) Siapa yang mengirim "bangun"
2) Observer di UIViewController
3) Protokol
sumber