Bagaimana saya, dalam kode pengontrol tampilan, membedakan antara:
- disajikan secara sederhana
- mendorong tumpukan navigasi
Kedua presentingViewController
dan isMovingToParentViewController
yang YES
dalam kedua kasus, sehingga tidak sangat membantu.
Yang memperumit masalah adalah bahwa pengontrol tampilan orang tua saya terkadang modal, di mana pengontrol tampilan yang akan diperiksa didorong.
Ternyata masalah saya adalah saya menyematkan saya HtmlViewController
di UINavigationController
yang kemudian disajikan. Itulah mengapa upaya saya sendiri dan jawaban bagus di bawah ini tidak berhasil.
HtmlViewController* termsViewController = [[HtmlViewController alloc] initWithDictionary:dictionary];
UINavigationController* modalViewController;
modalViewController = [[UINavigationController alloc] initWithRootViewController:termsViewController];
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:modalViewController
animated:YES
completion:nil];
Saya kira saya lebih baik memberi tahu pengontrol tampilan saya ketika itu modal, daripada mencoba menentukan.
ios
objective-c
swift
uiviewcontroller
uinavigationcontroller
arti-penting
sumber
sumber
presentingViewController
selaluYES
dalam kasus saya; tidak membantu.presentingViewController
kembaliYES
untuk VC yang didorong, ketika adaUITabBarController
yang disetel sebagai root. Jadi, tidak cocok untuk kasus saya.Di Swift :
Tambahkan tanda untuk menguji apakah itu modal menurut jenis kelas:
sumber
var isModal: Bool {}
false
parameter terakhir dalamreturn
pernyataan itu?Anda diabaikan salah satu metode:
isBeingPresented
.isBeingPresented
adalah benar saat pengontrol tampilan disajikan dan salah saat didorong.sumber
isBeingPresented
adalahNO
. Tapi saya melihat alasannya sekarang, saya menyematkan pengontrol tampilan saya yang disajikan di aUINavigationController
, dan itulah yang saya dorong.p
, bukanpo
saat mencetak nilai primitif.po
adalah untuk mencetak objek.isBeingPresented
- Metode ini mengembalikan YA hanya ketika dipanggil dari dalam metode viewWillAppear: dan viewDidAppear :.isBeingPresented
,isBeingDismissed
,isMovingFromParentViewController
danisMovingToParentViewController
hanya berlaku dalam 4view[Will|Did][Disa|A]ppear
metode.Swift 5
Berikut adalah solusi yang membahas masalah yang disebutkan dengan jawaban sebelumnya, ketika
isModal()
pengembaliantrue
jika didorongUIViewController
dalamUINavigationController
tumpukan yang disajikan .Sejauh ini hal itu berhasil untuk saya. Jika beberapa pengoptimalan, silakan bagikan.
sumber
tabBarController?.presentingViewController is UITabBarController
? Apakah penting jika itupresentingViewController
juga UITabBarController?isModal
akan kembalitrue
. Apakah ini dimaksudkan?Untuk menangani kasus di mana pengontrol tampilan saat ini didorong sementara pengontrol navigasi disajikan secara sederhana, saya telah menambahkan beberapa baris kode untuk memeriksa apakah pengontrol tampilan saat ini adalah pengontrol root di tumpukan navigasi.
sumber
Cepat 4
sumber
Cepat 5. Bersih dan sederhana.
sumber
Seperti yang disarankan oleh banyak orang di sini, bahwa metode "pemeriksaan" tidak berfungsi dengan baik untuk semua kasus, dalam proyek saya, saya telah menemukan solusi untuk mengelolanya secara manual. Intinya adalah, kita biasanya mengelola presentasi sendiri - bukan ini yang terjadi di belakang layar dan kita harus mawas diri.
DEViewController.h
mengajukan:Presentasi sekarang dapat diatur dengan cara ini:
didorong pada tumpukan navigasi:
disajikan secara sederhana dengan navigasi:
disajikan secara sederhana:
Selain itu, di dalam
DEViewController
kita dapat menambahkan fallback ke "memeriksa" jika properti yang disebutkan di atas sama denganSSViewControllerPresentationMethodUnspecified
:sumber
Dengan asumsi bahwa semua viewController yang Anda sajikan secara sederhana dibungkus di dalam navigationController baru (yang harus selalu Anda lakukan), Anda dapat menambahkan properti ini ke VC Anda.
sumber
Untuk mendeteksi pengontrol Anda didorong atau tidak, cukup gunakan kode di bawah ini di mana pun Anda inginkan:
Saya harap kode ini dapat membantu siapa saja ...
sumber
self.navigationController != nil
berarti itu ada di tumpukan navigasi.sumber
sumber
Jika Anda menggunakan ios 5.0 atau lebih baru dari silakan gunakan kode ini
sumber
Swift 5
Ekstensi praktis ini menangani lebih banyak kasus daripada jawaban sebelumnya. Kasus-kasus ini adalah VC (pengontrol tampilan) adalah root VC jendela aplikasi, VC ditambahkan sebagai anak ke induk VC. Ia mencoba mengembalikan true hanya jika viewcontroller disajikan secara sederhana.
Terima kasih atas jawaban Jonauz . Sekali lagi ada ruang untuk lebih banyak pengoptimalan. Silakan diskusikan tentang kasus yang perlu ditangani di bagian komentar.
sumber
Untuk beberapa orang yang bertanya-tanya, Bagaimana cara memberi tahu ViewController bahwa itu sedang disajikan
jika
A
mempresentasikan / mendorongB
Tentukan
enum
danproperty
dalamB
Sekarang dalam
A
pengontrol tampilan, beri tahuB
apakah itu disajikan / didorong dengan menetapkanpresentationStyle
Penggunaan di
B
View Controllersumber
Ini akan memberi tahu Anda jika viewController disajikan atau didorong
sumber