Saya telah mendorong tampilan ke pengontrol navigasi dan ketika saya menekan tombol kembali, itu beralih ke tampilan sebelumnya secara otomatis. Saya ingin melakukan beberapa hal saat tombol kembali ditekan sebelum memunculkan tampilan dari tumpukan. Apa fungsi panggilan balik tombol kembali?
102
Jawaban:
William Jockusch ini jawaban mengatasi masalah ini dengan trik mudah.
sumber
Menurut saya solusi terbaik.
Tapi itu hanya bekerja dengan iOS5 +
sumber
mungkin lebih baik untuk mengganti tombol kembali sehingga Anda bisa menangani acara sebelum tampilan dimunculkan untuk hal-hal seperti konfirmasi pengguna.
di viewDidLoad buat UIBarButtonItem dan setel self.navigationItem.leftBarButtonItem ke dalamnya dengan meneruskan sel
Kemudian Anda dapat melakukan hal-hal seperti menaikkan UIAlertView untuk mengonfirmasi tindakan, lalu memunculkan pengontrol tampilan, dll.
Atau daripada membuat backbutton baru, Anda dapat menyesuaikan metode delegasi UINavigationController untuk melakukan tindakan saat tombol kembali ditekan.
sumber
UINavigationControllerDelegate
memiliki metode yang dipanggil saat tombol kembali diketuk.Ini adalah cara yang benar untuk mendeteksi ini.
metode ini dipanggil saat view didorong juga. Jadi memeriksa induk == nil adalah untuk memunculkan pengontrol tampilan dari tumpukan
sumber
Saya berakhir dengan solusi ini. Seperti yang kita ketuk metode viewDidDisappear tombol kembali disebut. kita bisa memeriksa dengan memanggil pemilih isMovingFromParentViewController yang mengembalikan nilai true. kami dapat mengirimkan data kembali (Menggunakan Delegasi). semoga ini membantu seseorang.
sumber
[super viewDidDisappear:animated]
Mungkin agak terlambat, tapi saya juga menginginkan perilaku yang sama sebelumnya. Dan solusi yang saya gunakan berfungsi dengan cukup baik di salah satu aplikasi yang saat ini ada di App Store. Karena saya belum melihat ada orang yang menggunakan metode serupa, saya ingin membagikannya di sini. Kelemahan dari solusi ini adalah membutuhkan subclassing
UINavigationController
. Meskipun menggunakan Metode Swizzling dapat membantu menghindari itu, saya tidak melangkah sejauh itu.Jadi, tombol kembali default sebenarnya dikelola oleh
UINavigationBar
. Saat pengguna mengetuk tombol kembali,UINavigationBar
tanyakan delegasinya apakah harus memunculkan bagian atasUINavigationItem
dengan meneleponnavigationBar(_:shouldPop:)
.UINavigationController
sebenarnya menerapkan ini, tetapi tidak secara terbuka menyatakan bahwa ia mengadopsiUINavigationBarDelegate
(mengapa !?). Untuk menghentikan acara ini, buat subkelas dariUINavigationController
, nyatakan kesesuaiannya,UINavigationBarDelegate
dan implementasikannavigationBar(_:shouldPop:)
. Kembalikantrue
jika item teratas harus muncul. Kembalikanfalse
jika harus tinggal.Ada dua masalah. Yang pertama adalah Anda harus memanggil
UINavigationController
versinavigationBar(_:shouldPop:)
di beberapa titik. TetapiUINavigationBarController
tidak secara terbuka menyatakan kesesuaiannyaUINavigationBarDelegate
, mencoba memanggilnya akan menghasilkan kesalahan waktu kompilasi. Solusi yang saya gunakan adalah dengan menggunakan runtime Objective-C untuk mendapatkan implementasi secara langsung dan memanggilnya. Tolong beritahu saya jika ada yang punya solusi yang lebih baik.Masalah lainnya adalah yang
navigationBar(_:shouldPop:)
dipanggil pertama diikuti olehpopViewController(animated:)
jika pengguna mengetuk tombol kembali. Urutan berbalik jika pengontrol tampilan dimunculkan dengan memanggilpopViewController(animated:)
. Dalam hal ini, saya menggunakan boolean untuk mendeteksi jikapopViewController(animated:)
dipanggil sebelumnyanavigationBar(_:shouldPop:)
yang berarti pengguna telah mengetuk tombol kembali.Juga, saya membuat perpanjangan
UIViewController
untuk membiarkan pengontrol navigasi menanyakan pengontrol tampilan apakah itu harus muncul jika pengguna mengetuk tombol kembali. Pengontrol tampilan dapat kembalifalse
dan melakukan tindakan yang diperlukan dan meneleponpopViewController(animated:)
nanti.Dan dalam Anda melihat pengontrol, implementasikan
shouldBePopped(_:)
. Jika Anda tidak menerapkan metode ini, perilaku default-nya adalah memunculkan pengontrol tampilan segera setelah pengguna mengetuk tombol kembali seperti biasa.Anda dapat melihat demo saya di sini .
sumber
Untuk "SEBELUM memunculkan tampilan dari tumpukan":
sumber
Ada cara yang lebih tepat daripada meminta viewControllers. Anda dapat membuat pengontrol Anda menjadi delegasi navigationBar yang memiliki tombol kembali. Berikut contohnya. Dalam implementasi pengontrol di mana Anda ingin menangani penekanan tombol kembali, beri tahu bahwa itu akan mengimplementasikan protokol UINavigationBarDelegate:
Kemudian di suatu tempat di kode inisialisasi Anda (mungkin dalam viewDidLoad) jadikan pengontrol Anda sebagai delegasi bilah navigasinya:
Terakhir, terapkan metode shouldPopItem. Metode ini dipanggil tepat saat tombol kembali ditekan. Jika Anda memiliki beberapa pengontrol atau Item navigasi dalam tumpukan, Anda mungkin ingin memeriksa item navigasi mana yang muncul (parameter item), sehingga Anda hanya melakukan hal-hal khusus saat Anda mengharapkannya. Berikut contohnya:
sumber
Jika Anda tidak dapat menggunakan "viewWillDisappear" atau metode serupa, coba subkelas UINavigationController. Ini adalah kelas header:
Kelas implementasi:
Di sisi lain, Anda perlu menautkan viewController ini ke NavigationController kustom Anda, jadi, dalam metode viewDidLoad untuk viewController reguler Anda, lakukan ini:
sumber
Berikut cara lain yang saya terapkan (tidak mengujinya dengan segue rileks tetapi mungkin tidak akan membedakan, seperti yang dinyatakan orang lain sehubungan dengan solusi lain di halaman ini) agar pengontrol tampilan induk melakukan tindakan sebelum anak VC yang didorongnya muncul dari tumpukan tampilan (saya menggunakan ini beberapa level di bawah dari UINavigationController asli). Ini juga dapat digunakan untuk melakukan tindakan sebelum childVC didorong juga. Ini memiliki keuntungan tambahan untuk bekerja dengan tombol kembali sistem iOS, daripada harus membuat UIBarButtonItem atau UIButton kustom.
Minta VC orang tua Anda untuk mengadopsi
UINavigationControllerDelegate
protokol dan mendaftar untuk pesan delegasi:Terapkan
UINavigationControllerDelegate
metode contoh ini diMyParentViewController
:Jika Anda menentukan fungsi panggilan balik tertentu dalam
UINavigationControllerDelegate
metode contoh di atas}
sumber
Inilah yang berhasil untuk saya di Swift:
sumber
Jika Anda menggunakan Storyboard dan Anda berasal dari segmen push, Anda juga bisa mengganti
shouldPerformSegueWithIdentifier:sender:
.sumber