Não consigo obter o máximo de vantagem UIViewController
sem acesso a um UINavigationController
. Aqui está o que eu tenho até agora:
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(vc, animated: true, completion: nil)
No entanto, parece não fazer nada. Os valores keyWindow
e também rootViewController
parecem não-nulos, portanto, o encadeamento opcional não deve ser um problema.
NOTA: É uma má idéia fazer algo assim. Ele quebra o padrão MVC.
swift
uiviewcontroller
Zoyt
fonte
fonte
Respostas:
presentViewController
mostra um controlador de exibição. Não retorna um controlador de exibição. Se você não estiver usando umUINavigationController
, provavelmente está procurandopresentedViewController
e precisará começar pela raiz e percorrer as visualizações apresentadas.Para Swift 3+:
Para iOS 13+
fonte
topController.presentedViewController
retorna algo (ou seja, o controlador possui um controlador filho apresentado). Éwhile let
reforçar o fato de quetopController.presentedViewController
deve retornar algo. Se retornar nulo (ou seja, este controlador não possui filhos apresentados), ele interromperá o loop. No corpo do loop, ele reatribui a criança como a correntetopController
e volta novamente, descendo a hierarquia do controlador de exibição. Ele pode ser reatribuídotopController
, pois é umvar
naif
declaração externa .while let
. Obviamente, há muitosif let
exemplos a serem encontrados.let x = somethingThatCouldBeNil
sintaxe é um truque super útil para usar em qualquer lugar em que um valor / condição de verdade possa ser usado. Se não o usássemos aqui, teríamos que atribuir explicitamente um valor e testar para ver se ele realmente existe. Eu acho que é realmente sucinto e expressivo.tem essa extensão
Swift 2. *
Swift 3
Você pode usar isso em qualquer lugar do seu controlador
fonte
return
). Como ele pode entrar em um loop infinito?Para Swift 4/5 + para obter a melhor vista
Como usar
fonte
Uso:
fonte
return UIWindow.getVisibleViewControllerFrom(presentedViewController.presentedViewController!)
.presentedViewController.presentedViewController
, precisa ou não?Com base na resposta de Dianz, a versão do Objective-C
fonte
Eu amei a resposta de @ dianz , e aqui está a versão rápida do 3. É basicamente a mesma coisa, mas ele estava com uma falta de chave e alguns dos nomes de sintaxe / variável / método foram alterados. Então aqui está!
O uso ainda é exatamente o mesmo:
fonte
https://gist.github.com/db0company/369bfa43cb84b145dfd8 Fiz alguns testes nas respostas e comentários neste site. Para mim, os seguintes trabalhos
Em seguida, obtenha o viewController superior:
fonte
Use este código para encontrar os principais UIViewController
fonte
Pequena variação no @AlberZou usando uma variável computada em vez de uma função
Então diga
fonte
Baseado em Bob -c acima:
Swift 3.0
fonte
Muitos sabores, mas nenhum elaborado iterativo. Combinado dos anteriores:
fonte
você pode definir uma variável UIViewController no AppDelegate e, em cada viewWillAppear, definir a variável como self (no entanto, a resposta dianz é a melhor resposta).
fonte
Para encontrar o viewController visível no Swift 3
Esse código encontra o último controlador adicionado ou o último controlador ativo visível.
Isso eu usei no AppDelegate para encontrar o Active View Controller
fonte
fonte
Onde você inseriu o código?
Eu tento seu código na minha demonstração, descobri, se você colocar o código em
falhará, porque a janela principal já foi definida.
Mas eu coloquei seu código em algum view controller
Isso simplesmente funciona.
fonte
didFinishLaunchingWithOptions
. Eu só preciso disso para vários fins de depuração.Em um caso muito raro, com segue personalizado, o controlador de visualização mais superior não está em uma pilha de navegação ou controlador de barra de guias ou é apresentado, mas sua visualização é inserida na parte superior das subvisões principais de windown.
Em tal situação, é necessário verificar se
UIApplication.shared.keyWindow.subviews.last == self.view
para determinar se o controlador de exibição atual é o mais superior.fonte
Para quem procura uma solução rápida 5 / iOS 13+ (
keywindow
está obsoleta desde o iOS 13)fonte
fonte
A melhor solução para mim é uma extensão com uma função. Crie um arquivo rápido com esta extensão
Primeiro é a extensão UIWindow :
dentro desse arquivo adicionar função
E se você quiser usá-lo, pode chamá-lo em qualquer lugar. Exemplo :
O código do arquivo é assim :
fonte