Sepertinya saya tidak bisa mendapatkan yang teratas UIViewController
tanpa akses ke a UINavigationController
. Inilah yang saya miliki sejauh ini:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(vc, animated: true, completion: nil)
Namun, sepertinya tidak melakukan apa-apa. The keyWindow
dan rootViewController
tampaknya nilai-nilai non-nihil juga, sehingga chaining opsional seharusnya tidak menjadi masalah.
CATATAN: Adalah ide yang buruk untuk melakukan sesuatu seperti ini. Itu merusak pola MVC.
swift
uiviewcontroller
Zoyt
sumber
sumber
Jawaban:
presentViewController
menunjukkan pengontrol tampilan. Itu tidak mengembalikan view controller. Jika Anda tidak menggunakanUINavigationController
, Anda mungkin mencaripresentedViewController
dan Anda harus mulai dari root dan beralih melalui tampilan yang disajikan.Untuk Swift 3+:
Untuk iOS 13+
sumber
topController.presentedViewController
mengembalikan sesuatu (yaitu, pengontrol memiliki pengontrol anak yang disajikan). Iniwhile let
untuk menegakkan fakta yangtopController.presentedViewController
harus mengembalikan sesuatu. Jika mengembalikan nil (yaitu, ini controller tidak memiliki anak-anak yang disajikan), maka itu akan berhenti berulang. Dalam tubuh loop, ia menetapkan kembali anak sebagai arustopController
, dan loop lagi, turun hierarki pengontrol tampilan. Itu dapat menugaskan kembalitopController
karena ituvar
dalamif
pernyataan luar .while let
. Tentu saja ada banyakif let
contoh yang bisa ditemukan.let x = somethingThatCouldBeNil
sintaks adalah trik super berguna untuk digunakan di mana saja nilai kebenaran / kondisi dapat digunakan. Jika kami tidak menggunakannya di sini, kami harus menetapkan nilai secara eksplisit, lalu menguji untuk melihat apakah itu benar-benar ada. Saya pikir ini sangat ringkas dan ekspresif.memiliki ekstensi ini
Cepat 2. *
Cepat 3
Anda dapat menggunakan ini di mana saja pada pengontrol Anda
sumber
return
). Bagaimana itu bisa masuk ke loop tak terbatas?Untuk swift 4/5 + untuk mendapatkan viewController paling atas
Cara Penggunaan
sumber
Pemakaian:
sumber
return UIWindow.getVisibleViewControllerFrom(presentedViewController.presentedViewController!)
.presentedViewController.presentedViewController
, atau tidak?Berdasarkan jawaban Dianz, versi Objective-C
sumber
Saya menyukai jawaban @ dianz , dan ini adalah versi cepatnya. Ini pada dasarnya hal yang sama tetapi dia tidak memiliki kurung kurawal dan beberapa nama sintaks / variabel / metode telah berubah. Jadi begini!
Penggunaannya masih sama persis:
sumber
https://gist.github.com/db0company/369bfa43cb84b145dfd8 Saya melakukan beberapa tes pada jawaban dan komentar di situs ini. Bagi saya, berikut ini berfungsi
Lalu, dapatkan viewController teratas dengan:
sumber
Gunakan kode ini untuk menemukan sebagian besar UIViewController
sumber
Sedikit variasi pada @AlberZou menggunakan variabel yang dikomputasi daripada fungsi
Lalu berkata
sumber
Berdasarkan Bob -c di atas:
Swift 3.0
sumber
Terlalu banyak rasa tetapi tidak ada yang berulang yang diuraikan. Digabungkan dari yang sebelumnya:
sumber
Anda dapat mendefinisikan variabel UIViewController di AppDelegate, dan di setiap viewWillAppear atur variabel menjadi self (tetapi jawaban dianz adalah jawaban terbaik.)
sumber
Untuk menemukan viewController yang terlihat di Swift 3
Kode ini menemukan yang terakhir ditambahkan atau pengendali aktif terakhir terlihat.
Ini telah saya gunakan di AppDelegate untuk menemukan Pengontrol tampilan aktif
sumber
sumber
Di mana Anda memasukkan kode?
Saya mencoba kode Anda di demo saya, saya tahu, jika Anda memasukkan kode
akan gagal, karena jendela kunci telah diatur.
Tapi saya meletakkan kode Anda di beberapa view controller
Itu hanya bekerja.
sumber
didFinishLaunchingWithOptions
. Saya hanya perlu ini untuk berbagai keperluan debug.Dalam kasus yang sangat jarang, dengan segmen khusus, pengontrol tampilan terbanyak atas tidak ada di tumpukan navigasi atau pengontrol tab bar atau disajikan, tetapi pandangannya dimasukkan ke bagian atas tampilan bawah kunci utama windown.
Dalam situasi seperti itu, perlu untuk memeriksa apakah
UIApplication.shared.keyWindow.subviews.last == self.view
menentukan apakah pengendali tampilan saat ini adalah yang paling top.sumber
Bagi siapa pun yang mencari solusi cepat 5 / iOS 13+ (
keywindow
sudah usang sejak iOS 13)sumber
UIApplication.getTopMostViewController()
di dalam ViewController Anda. @ChrisComassumber
Solusi terbaik bagi saya adalah ekstensi dengan fungsi. Buat file cepat dengan ekstensi ini
Pertama adalah ekstensi UIWindow :
di dalam file itu tambahkan fungsi
Dan jika Anda ingin menggunakannya, Anda dapat memanggilnya di mana saja. Contoh :
Kode file seperti ini :
sumber