Apakah mungkin untuk memeriksa di dalam kelas ViewController yang disajikan sebagai pengontrol tampilan modal?
iphone
ios
view
controller
modal-dialog
lukewar
sumber
sumber
nil == nil
mengembalikanYES
, dan itu bukan hasil yang kita inginkan.Jika Anda mencari iOS 6+, jawaban ini sudah usang dan Anda harus memeriksa jawaban Gabriele Petronella
Tidak ada cara yang tepat untuk melakukan itu, sebagai properti atau metode asli UIKit. Yang dapat Anda lakukan adalah memeriksa beberapa aspek pengontrol Anda untuk memastikannya disajikan sebagai modal.
Jadi, untuk memeriksa apakah pengontrol saat ini (direpresentasikan seperti
self
pada kode di bawah) disajikan dengan cara modal atau tidak, saya memiliki fungsi di bawah ini baik dalamUIViewController
kategori, atau (jika proyek Anda tidak perlu menggunakan pengontrol UIKit lainnya, sepertiUITableViewController
misalnya) dalam pengontrol dasar yang diwarisi oleh pengontrol saya yang lainEDIT: Saya menambahkan pemeriksaan terakhir untuk melihat apakah UITabBarController sedang digunakan, dan Anda menyajikan UITabBarController lain sebagai modal.
EDIT 2: menambahkan cek iOS 5+, di mana
UIViewController
tidak menjawabparentViewController
lagi, tetapipresentingViewController
sebagai gantinya.EDIT 3: Saya telah membuat intinya untuk berjaga-jaga jika https://gist.github.com/3174081
sumber
modalViewController
properti ini tidak digunakan lagi mulai iOS 6. Dokumentasi menyarankan untuk digunakanpresentedViewController
.NSLog(@"%@", self.navigationController.parentViewController)
cetakan(null)
- bisakah Anda menjelaskan mengapa? ViewController saya terhubung dengan pengontrol tampilan modal melalui navController di storyboard..parentViewController
sudah usang,.presentingViewController
harus digunakan sebagai gantinya.Di iOS5 +, Seperti yang Anda lihat di Referensi Kelas UIViewController , Anda bisa mendapatkannya dari properti "presentingViewController".
presentingViewController Pengontrol tampilan yang menyajikan pengontrol tampilan ini. (hanya baca)
@property (nonatomik, hanya baca) UIViewController * Diskusi presentingViewController
Jika pengontrol tampilan yang menerima pesan ini disajikan oleh pengontrol tampilan lain, properti ini menahan pengontrol tampilan yang mempresentasikannya. Jika pengontrol tampilan tidak disajikan, tetapi salah satu pendahulunya disajikan, properti ini menahan pengontrol tampilan yang menyajikan leluhur terdekat. Jika tidak ada pengontrol tampilan atau salah satu leluhurnya yang disajikan, properti ini memegang nol.
Ketersediaan
Tersedia di iOS 5.0 dan lebih baru.
Dinyatakan Dalam
UIViewController.h
sumber
presentingViewController
. Ini juga akan bekerja di pengontrol tampilan kontainer, karena secara otomatis melintasi leluhur.Jika tidak ada, Anda bisa mendefinisikan properti untuk this (
presentedAsModal
) di subkelas UIViewController Anda dan menyetelnya keYES
sebelum menyajikan ViewController sebagai tampilan modal.Anda dapat memeriksa nilai ini di
viewWillAppear
override Anda .Saya yakin tidak ada properti resmi yang menyatakan bagaimana tampilan tersebut disajikan, tetapi tidak ada yang menghalangi Anda untuk membuatnya sendiri.
sumber
UINavigationController
sebagai modal ... kecuali Anda membuat pengontrol navigasi kustom hanya untuk menambahkan properti ini. Dan setelah itu, di dalam pengontrol, Anda harus terus mentransmisikanself.navigationController
ke kelas khusus ini setiap kali Anda perlu memeriksa apakah pengontrol disajikan sebagai modalJawaban Petronella tidak berfungsi jika self.navigationController disajikan secara sederhana tetapi self tidak sama dengan self.navigationController.viewControllers [0], dalam hal ini self didorong.
Inilah cara Anda memperbaiki masalah.
Dan di Swift:
sumber
Ini seharusnya berhasil.
sumber
UINavigationController
danUITabBarController
kasus. Ini bekerja dengan cukup baik sejauh iniCara terbaik untuk memeriksanya
sumber
Jika Anda tidak perlu membedakan antara tampilan modal layar penuh dan tampilan non-modal, yang merupakan kasus dalam proyek saya (saya berurusan dengan masalah yang hanya terjadi dengan lembar formulir dan lembar halaman), Anda dapat menggunakan modalPresentationStyle properti UIViewController:
sumber
Di Swift :
sumber
Dalam proyek saya, saya memiliki pengontrol tampilan (Detail) yang dapat disajikan baik secara sederhana (saat menambahkan item baru) atau dengan push (saat mengedit yang sudah ada) oleh pengontrol tampilan Master. Ketika pengguna mengetuk [Selesai], pengontrol tampilan Detail memanggil metode pengontrol tampilan Master untuk memberi tahu bahwa itu siap untuk ditutup. Guru harus menentukan bagaimana Detail disajikan untuk mengetahui bagaimana menutupnya. Beginilah cara saya melakukan ini:
sumber
Peretasan seperti ini mungkin berhasil.
Namun, saya pikir jawaban saya sebelumnya adalah solusi yang lebih bersih.
sumber
Apa yang berhasil untuk saya adalah sebagai berikut:
Sejauh saya mengujinya, ini berfungsi untuk iOS7 dan iOS8. Namun tidak mencoba di iOS6.
sumber
Saya telah melihat-lihat untuk menemukan jawaban yang tepat untuk pertanyaan ini, dan saya tidak dapat menemukan jawaban yang mencakup semua kemungkinan skenario. Saya menulis beberapa baris kode ini yang tampaknya berhasil. Anda dapat menemukan beberapa komentar sebaris untuk mencari tahu apa yang telah diperiksa.
Semoga bantuan ini.
sumber
Inilah versi modifikasi saya dari @ GabrielePetronella's
isModal
, yang berfungsi dengan pengontrol tampilan yang ada di dalamnya yang berjalan naik hierarki parentViewController terlebih dahulu. Juga tarik kode menjadi beberapa baris sehingga jelas apa yang dilakukannya.sumber