Tentativo di presentare UIViewController su UIViewController la cui vista non è nella gerarchia di finestre


599

Ho appena iniziato a usare Xcode 4.5 e ho riscontrato questo errore nella console:

Avvertenza: Tentare di presentare <finishViewController: 0x1e56e0a0> su <ViewController: 0x1ec3e000> la cui vista non è nella gerarchia di finestre!

La vista viene ancora presentata e tutto nell'app funziona correttamente. È qualcosa di nuovo in iOS 6?

Questo è il codice che sto usando per cambiare tra le visualizzazioni:

UIStoryboard *storyboard = self.storyboard;
finishViewController *finished = 
[storyboard instantiateViewControllerWithIdentifier:@"finishViewController"];

[self presentViewController:finished animated:NO completion:NULL];

3
Sto riscontrando lo stesso identico problema, ad eccezione del tentativo di chiamare presentViewController:animated:completionun controller di navigazione. Lo stai facendo nel delegato dell'app?
Tarnfeld,

No, lo sto facendo da un controller di visualizzazione all'altro. Hai trovato delle soluzioni?
Kyle Goslan,

Stesso problema su una parte di codice che ha sempre funzionato prima di usare Xcode 4.5, sto presentando un UINavigationController, ma ancora una volta ha funzionato prima.
Emanuele Fumagalli,

Ho lo stesso problema, non risolto. Farlo dal delegato dell'app e il rootviewcontroller che chiama "presentViewController" diventa un UITabBarController.
Darksider,

3
inoltre, se si chiama questo metodo prima di chiamare makeKeyAndVisible, spostarlo dopo
mike_haney il

Risposte:


1296

Da dove chiami questo metodo? Ho avuto un problema in cui stavo tentando di presentare un controller di visualizzazione modale all'interno del viewDidLoadmetodo. La soluzione per me è stata quella di spostare questa chiamata alviewDidAppear: metodo.

La mia presunzione è che la vista del controller di visualizzazione non si trova nella gerarchia di visualizzazione della finestra nel punto in cui è stata caricata (quando viewDidLoadviene inviato il messaggio), ma si trova nella gerarchia di finestre dopo che è stata presentata (quando viewDidAppear:viene inviato il messaggio) .


Attenzione

Se si effettua una chiamata a presentViewController:animated:completion:in, viewDidAppear:è possibile che si verifichi un problema per cui il controller di visualizzazione modale viene sempre presentato ogni volta che appare la vista del controller di visualizzazione (il che ha senso!) E quindi il controller di visualizzazione modale presentato non andrà mai via .. .

Forse questo non è il posto migliore per presentare il controller di visualizzazione modale, o forse è necessario mantenere uno stato aggiuntivo che consenta al controller di visualizzazione presentante di decidere se deve presentare immediatamente il controller di visualizzazione modale.


6
@James hai ragione, la vista apparentemente non è nella gerarchia fino a quando viewWillAppear non è stato risolto e una volta chiamato viewDidAppear. Se questa fosse la mia domanda accetterei questa risposta;)
Matt Mc

6
@james Grazie. L'uso di ViewDidAppear ha risolto il problema anche per me. Ha senso.
Ali,

44
Vorrei poter votare questo due volte. Ho appena avuto questo problema e sono arrivato al thread per scoprire che avevo già votato per l'ultima volta che l'ho visto.
Schrockwell,

7
Si noti che quando si modifica il VC in viewDidAppear, ciò provoca l'esecuzione di un seguito, con animazione. Provoca un flash / visualizzazione dello sfondo.
Vincent,

2
Sì, il trucco è viewWillAppear: (BOOL) animato come è corretto. Un'altra cosa importante che devi chiamare super nel metodo, come [super viewDidAppear: animato]; senza questo non funziona.
BootMaker

66

Un'altra potenziale causa:

Ho avuto questo problema quando ho presentato accidentalmente lo stesso controller di visualizzazione due volte. (Una volta con performSegueWithIdentifer:sender:cui è stato chiamato quando è stato premuto il pulsante, e una seconda volta con un seguito collegato direttamente al pulsante).

In effetti, due segues stavano sparando allo stesso tempo, e ho ricevuto l'errore: Attempt to present X on Y whose view is not in the window hierarchy!


4
Ho avuto lo stesso errore, e la tua risposta qui mi ha aiutato a capire cosa stava succedendo, è stato davvero questo errore, risolto grazie a te signore, grazie, +1
sabato

1
Ho eliminato il vecchio segue e ho collegato VC a VC. C'è un modo per collegare il pulsante allo storyBoard al VC perché in questo modo continua a sbagliarmi?
MCB,

Ho avuto lo stesso errore, la tua risposta ha risolto il mio problema, grazie per l'attenzione. Cordiali saluti.
iamburak,

1
lol, accidentalmente stavo anche creando due vc: da button ed performSegue, grazie per la punta !!!
Borzh

1
Nel mio caso stavo chiamando present(viewController, animated: true, completion: nil)in un loop.
Samo,

38

viewWillLayoutSubviewse viewDidLayoutSubviews(iOS 5.0+) possono essere usati per questo scopo. Sono chiamati prima di viewDidAppear.


3
Tuttavia vengono utilizzati anche in altre occasioni, quindi penso che potrebbero essere chiamati più volte nella "vita" di una vista.
Jonny

Inoltre, non è ciò a cui servono i metodi, come suggerisce il nome. viewDidAppear è corretto. Leggere sul ciclo di vita della vista è una buona idea.
tooluser

Questa è la soluzione migliore Nel mio caso, la presentazione in viewDidAppear provoca una visualizzazione in una frazione di secondo del controller di visualizzazione prima che il modale sia caricato, il che è inaccettabile.
TMilligan,

Questa risposta ha funzionato al meglio per me quando ho cercato di visualizzare un avviso. L'avviso non viene visualizzato quando lo metto in viewDidLoad e viewWillAppear.
uplearnedu.com

26

Per visualizzare qualsiasi sottoview alla vista principale, utilizzare il codice seguente

UIViewController *yourCurrentViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

while (yourCurrentViewController.presentedViewController) 
{
   yourCurrentViewController = yourCurrentViewController.presentedViewController;
}

[yourCurrentViewController presentViewController:composeViewController animated:YES completion:nil];

Per Ignora qualsiasi sottoview dalla vista principale, utilizzare il seguente codice

UIViewController *yourCurrentViewController = [UIApplication sharedApplication].keyWindow.rootViewController;

while (yourCurrentViewController.presentedViewController) 
{
   yourCurrentViewController = yourCurrentViewController.presentedViewController;
}

[yourCurrentViewController dismissViewControllerAnimated:YES completion:nil];

Ha funzionato anche per me
Aziz Javed

17

Ho riscontrato anche questo problema quando ho provato a presentare un UIViewControllerin viewDidLoad. La risposta di James Bedford ha funzionato, ma la mia app ha mostrato prima lo sfondo per 1 o 2 secondi.

Dopo alcune ricerche, ho trovato il modo di risolverlo usando il addChildViewController.

- (void)viewDidLoad
{
    ...
    [self.view addSubview: navigationViewController.view];
    [self addChildViewController: navigationViewController];
    ...
}

9
Penso che ti manchi [navigationViewController didMoveToParentViewController: self]
foFox

2
Ho provato il tuo codice, insieme al suggerimento di foFox, e quando vado a rimuoverlo dal suo genitore, non andrà via. Lololol. Ancora bloccato senza alcuna correzione.
Logicsaurus Rex,

Funziona in Swift3.1
Kang Byul il

@sunkehappy sopra due righe da utilizzare prima di presentviewcontroller, ma è andato in crash perché?
Iyyappan Ravi,

14

Probabilmente, come me, hai una radice sbagliata viewController

Voglio visualizzare un ViewControllerin un non-UIViewControllercontesto,

Quindi non posso usare questo codice:

[self presentViewController:]

Quindi, ottengo un UIViewController:

[[[[UIApplication sharedApplication] delegate] window] rootViewController]

Per qualche motivo (bug logico), rootViewControllerc'è qualcosa di diverso dal previsto (un normale UIViewController). Quindi correggo il bug, sostituendolo rootViewControllercon a UINavigationController, e il problema scompare.


8

TL; DR Puoi avere solo 1 rootViewController ed è l'ultimo presentato. Quindi non provare ad avere un viewcontroller che presenta un altro viewcontroller quando ne è già stato presentato uno che non è stato scartato.

Dopo aver fatto alcuni dei miei test sono giunto a una conclusione.

Se si dispone di un rootViewController che si desidera presentare tutto, è possibile riscontrare questo problema.

Ecco il mio codice rootController (open è il mio collegamento per presentare un viewcontroller dal root).

func open(controller:UIViewController)
{
    if (Context.ROOTWINDOW.rootViewController == nil)
    {
        Context.ROOTWINDOW.rootViewController = ROOT_VIEW_CONTROLLER
        Context.ROOTWINDOW.makeKeyAndVisible()
    }

    ROOT_VIEW_CONTROLLER.presentViewController(controller, animated: true, completion: {})
}

Se chiamo aperto due volte di seguito (indipendentemente dal tempo trascorso), funzionerà perfettamente sulla prima apertura, ma NON sulla seconda apertura. Il secondo tentativo di apertura comporterà l'errore sopra.

Tuttavia, se chiudo la vista presentata più di recente, quindi apro open, funziona perfettamente quando chiamo nuovamente open (su un altro viewcontroller).

func close(controller:UIViewController)
{
    ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}

Quello che ho concluso è che il rootViewController solo della CHIAMATA PIÙ RECENTE è nella Gerarchia della vista (anche se non l'hai scartata o rimossa una vista). Ho provato a giocare con tutte le chiamate del caricatore (viewDidLoad, viewDidAppear e fare chiamate di invio ritardate) e ho scoperto che l'unico modo per farlo funzionare è SOLO chiamare presente dal controller della vista più in alto.


Sembra un problema molto più comune che le molte risposte che hanno votato siano state votate tue. Sfortunatamente, questo è stato estremamente utile
rayepps,

sì, tutto bene, ma qual è la soluzione ... ho un thread di lavoro in background che va su un server e mostra storyboard a sinistra al centro e l'intera metodologia è fasulla .. è terribile .. ciò che dovrebbe essere un gioco da ragazzi è assolutamente un scherzo perché al voglio fare int in thread di sfondo è: wait wait decide push screen to fronted è IMPOSSIBILE è IOS ????
Heelis,

5

Il mio problema era che stava eseguendo la segue a UIApplicationDelegate's didFinishLaunchingWithOptionsmetodo prima ho chiamato makeKeyAndVisible()sulla finestra.


Come? Puoi elaborare? sto affrontando lo stesso problema. questo è il mio codice lasciare initialViewControlleripad: UIViewController = mainStoryboardIpad.instantiateViewController (withIdentifier: "SplashController") come UIViewController self.window .rootViewController = initialViewControlleripad self.window .makeKeyAndVisible ()??
shahtaj Khalid

4

Nella mia situazione, non sono stato in grado di mettere il mio in un override di classe. Quindi, ecco cosa ho ottenuto:

let viewController = self // I had viewController passed in as a function,
                          // but otherwise you can do this


// Present the view controller
let currentViewController = UIApplication.shared.keyWindow?.rootViewController
currentViewController?.dismiss(animated: true, completion: nil)

if viewController.presentedViewController == nil {
    currentViewController?.present(alert, animated: true, completion: nil)
} else {
    viewController.present(alert, animated: true, completion: nil)
}

3

Ho avuto lo stesso problema. Ho dovuto incorporare un controller di navigazione e presentare il controller attraverso di esso. Di seguito è riportato il codice di esempio.

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIImagePickerController *cameraView = [[UIImagePickerController alloc]init];
    [cameraView setSourceType:UIImagePickerControllerSourceTypeCamera];
    [cameraView setShowsCameraControls:NO];

    UIView *cameraOverlay = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 768, 1024)];
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"someImage"]];
    [imageView setFrame:CGRectMake(0, 0, 768, 1024)];
    [cameraOverlay addSubview:imageView];

    [cameraView setCameraOverlayView:imageView];

    [self.navigationController presentViewController:cameraView animated:NO completion:nil];
//    [self presentViewController:cameraView animated:NO completion:nil]; //this will cause view is not in the window hierarchy error

}


3

Ho avuto lo stesso problema. Il problema era che performSegueWithIdentifier è stato attivato da una notifica, non appena ho inserito la notifica sul thread principale il messaggio di avviso è sparito.


3

Funziona bene prova questo. collegamento

UIViewController *top = [UIApplication sharedApplication].keyWindow.rootViewController;
[top presentViewController:secondView animated:YES completion: nil];

3

Nel caso in cui aiuti qualcuno, il mio problema è stato estremamente sciocco. Totalmente colpa mia ovviamente. Una notifica stava innescando un metodo che chiamava il modale. Ma non stavo rimuovendo correttamente la notifica, quindi ad un certo punto avrei avuto più di una notifica, quindi il modale sarebbe stato chiamato più volte. Naturalmente, dopo aver chiamato il modale una volta, il viewcontroller che lo chiama non è più nella gerarchia della vista, ecco perché vediamo questo problema. La mia situazione ha causato anche un sacco di altri problemi, come ci si aspetterebbe.

Quindi, per riassumere, qualunque cosa tu stia facendo assicurati che il modale non venga chiamato più di una volta .


3

Ho finito con un codice del genere che finalmente funziona per me (Swift), considerando che vuoi visualizzarne alcuni viewControllerpraticamente ovunque. Questo codice ovviamente si arresterà in modo anomalo quando non è disponibile rootViewController, questo è il finale aperto. Inoltre non include il passaggio solitamente richiesto al thread dell'interfaccia utente utilizzando

dispatch_sync(dispatch_get_main_queue(), {
    guard !NSBundle.mainBundle().bundlePath.hasSuffix(".appex") else {
       return; // skip operation when embedded to App Extension
    }

    if let delegate = UIApplication.sharedApplication().delegate {
        delegate.window!!.rootViewController?.presentViewController(viewController, animated: true, completion: { () -> Void in
            // optional completion code
        })
    }
}

A proposito, per capire DOVE chiamo questo metodo da ... è la libreria SDK altrimenti UI-less, che mostra la sua UI sulla tua app in alcuni casi (non divulgati).
igraczech,

Arresto anomalo e masterizzazione se qualcuno decide di incorporare sdk in un'app con estensione. Passa un UIViewController per abusare del tuo metodo sdk init [s].
Anton Tropashko,

Sei vero Anton. Questo codice è stato scritto quando le estensioni non esistevano e SDK non è stato ancora utilizzato in nessuno di questi. Ho aggiunto una clausola di guardia per saltare questo caso limite.
igraczech

3

Questo tipo di avviso può significare che si sta cercando di presentare nuovi View Controllerattraverso Navigation Controllermentre questo Navigation Controllersta presentando un altro View Controller. Per risolvere il problema, è necessario eliminare View Controllerinizialmente presentato inizialmente e al termine presentare quello nuovo. Un'altra causa dell'avviso può essere il tentativo di presentare View Controllersul thread diverso da main.


3

Ho avuto un problema simile su Swift 4.2 ma la mia vista non è stata presentata dal ciclo di visualizzazione. Ho scoperto di avere più seguiti da presentare contemporaneamente. Quindi ho usato dispatchAsyncAfter.

func updateView() {

 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in

// for programmatically presenting view controller 
// present(viewController, animated: true, completion: nil)

//For Story board segue. you will also have to setup prepare segue for this to work. 
 self?.performSegue(withIdentifier: "Identifier", sender: nil)
  }
}

2

L'ho risolto spostando la start()funzione all'interno del dismissblocco di completamento:

self.tabBarController.dismiss(animated: false) {
  self.start()
}

Start contiene due chiamate a self.present()una per un UINavigationController e un'altra per aUIImagePickerController .

Ciò ha risolto il problema per me.


1

È inoltre possibile ricevere questo avviso quando si esegue un seguito da un controller di visualizzazione incorporato in un contenitore. La soluzione corretta è utilizzare segue dal genitore del contenitore, non dal controller di visualizzazione del contenitore.


1

Devo scrivere sotto la riga.

self.searchController.definesPresentationContext = true

invece di

self.definesPresentationContext = true

in UIViewController


1

Con Swift 3 ...

Un'altra possibile causa di ciò, che mi è accaduto, è stata il seguire da un tableViewCell a un altro ViewController sullo Storyboard. Ho usato anche override func prepare(for segue: UIStoryboardSegue, sender: Any?) {}quando è stato fatto clic sulla cella.

Ho risolto questo problema facendo un passaggio da ViewController a ViewController.


1

Ho riscontrato questo problema e la causa principale è stata la sottoscrizione a un gestore di clic sui pulsanti (TouchUpInside) più volte.

Si stava iscrivendo a ViewWillAppear, che veniva chiamato più volte da quando avevamo aggiunto la navigazione per passare a un altro controller, per poi riconnetterci.


1

Mi è successo che il seguito nello storyboard fosse una specie di rottura . L'eliminazione del seguito (e la creazione dello stesso seguito stesso) ha risolto il problema.


1

Con la finestra principale, probabilmente ci saranno sempre momenti con transizioni incompatibili con la presentazione di un avviso. Per consentire la presentazione degli avvisi in qualsiasi momento nel ciclo di vita dell'applicazione, è necessario disporre di una finestra separata per eseguire il lavoro.

/// independant window for alerts
@interface AlertWindow: UIWindow

+ (void)presentAlertWithTitle:(NSString *)title message:(NSString *)message;

@end

@implementation AlertWindow

+ (AlertWindow *)sharedInstance
{
    static AlertWindow *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[AlertWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
    });
    return sharedInstance;
}

+ (void)presentAlertWithTitle:(NSString *)title message:(NSString *)message
{
    // Using a separate window to solve "Warning: Attempt to present <UIAlertController> on <UIViewController> whose view is not in the window hierarchy!"
    UIWindow *shared = AlertWindow.sharedInstance;
    shared.userInteractionEnabled = YES;
    UIViewController *root = shared.rootViewController;
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
    alert.modalInPopover = true;
    [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
        shared.userInteractionEnabled = NO;
        [root dismissViewControllerAnimated:YES completion:nil];
    }]];
    [root presentViewController:alert animated:YES completion:nil];
}

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    self.userInteractionEnabled = NO;
    self.windowLevel = CGFLOAT_MAX;
    self.backgroundColor = UIColor.clearColor;
    self.hidden = NO;
    self.rootViewController = UIViewController.new;

    [NSNotificationCenter.defaultCenter addObserver:self
                                           selector:@selector(bringWindowToTop:)
                                               name:UIWindowDidBecomeVisibleNotification
                                             object:nil];

    return self;
}

/// Bring AlertWindow to top when another window is being shown.
- (void)bringWindowToTop:(NSNotification *)notification {
    if (![notification.object isKindOfClass:[AlertWindow class]]) {
        self.hidden = YES;
        self.hidden = NO;
    }
}

@end

Utilizzo di base che, in base alla progettazione, avrà sempre successo:

[AlertWindow presentAlertWithTitle:@"My title" message:@"My message"];

1

Purtroppo, la soluzione accettata non ha funzionato per il mio caso. Stavo cercando di navigare verso un nuovo View Controller subito dopo essermi rilassato da un altro View Controller.

Ho trovato una soluzione usando una bandiera per indicare quale svolgimento di svolgimento è stato chiamato.

@IBAction func unwindFromAuthenticationWithSegue(segue: UIStoryboardSegue) {
    self.shouldSegueToMainTabBar = true
}

@IBAction func unwindFromForgetPasswordWithSegue(segue: UIStoryboardSegue) {
    self.shouldSegueToLogin = true
}

Quindi presentare il VC desiderato con present(_ viewControllerToPresent: UIViewController)

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    if self.shouldSegueToMainTabBar {
        let mainTabBarController = storyboard.instantiateViewController(withIdentifier: "mainTabBarVC") as! MainTabBarController
        self.present(mainTabBarController, animated: true)
        self.shouldSegueToMainTabBar = false
    }
    if self.shouldSegueToLogin {
        let loginController = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LogInViewController
        self.present(loginController, animated: true)
        self.shouldSegueToLogin = false
    }
}

Fondamentalmente, il codice sopra mi consentirà di catturare lo svolgimento da login / SignUp VC e navigare nella dashboard, oppure catturare l'azione di svolgimento da dimenticare la password VC e passare alla pagina di accesso.


1

Ho corretto questo errore con l'archiviazione della maggior parte dei viewcontroller in costante che si trova all'interno mentre si scorre su rootViewController:

if var topController = UIApplication.shared.keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }
    topController.present(controller, animated: false, completion: nil)
    // topController should now be your topmost view controller
}

1

Ho trovato questo bug arrivato dopo aver aggiornato Xcode, credo a Swift 5 . Il problema si stava verificando quando ho avviato a livello di programmazione un seguito direttamente dopo aver svolto un controller di visualizzazione.

La soluzione è arrivata mentre correggeva un bug correlato, ovvero che l'utente era ora in grado di sbloccare i follow scorrendo verso il basso la pagina. Questo ha rotto la logica del mio programma.

È stato risolto modificando la modalità Presentazione su tutti i controller di visualizzazione da Automatico a Schermo intero .

Puoi farlo nel pannello degli attributi nel generatore di interfacce. O vedi questa risposta per come farlo programmaticamente.


0

Ho appena avuto anche questo problema, ma non ha avuto nulla a che fare con i tempi. Stavo usando un singleton per gestire le scene e l'ho impostato come presentatore. In altre parole, "Sé" non era collegato a nulla. Ho appena fatto della sua "scena" interiore il nuovo presentatore e voilà, ha funzionato. (Voila perde il suo tocco dopo averne appreso il significato, eh).

Quindi sì, non si tratta di "trovare magicamente la strada giusta", si tratta di capire dove si trova il codice e cosa sta facendo. Sono felice che Apple abbia dato un messaggio di avvertimento così semplice, anche con emozione. Complimenti allo sviluppatore di mele che l'ha fatto !!


0

Se le altre soluzioni non sembrano buone per qualche motivo, puoi comunque usare questo buon vecchio workarounddi presentare con il ritardo di 0, in questo modo:

dispatch_after(0, dispatch_get_main_queue(), ^{
    finishViewController *finished = [self.storyboard instantiateViewControllerWithIdentifier:@"finishViewController"];
    [self presentViewController:finished animated:NO completion:NULL];    
});

Anche se non ho visto alcuna garanzia documentata che il tuo VC sarebbe nella gerarchia della vista nel momento in cui il blocco di invio è programmato per l'esecuzione, ho osservato che funzionerebbe perfettamente.

È anche possibile utilizzare il ritardo, ad esempio 0,2 secondi. E la cosa migliore - in questo modo non è necessario pasticciare con la variabile booleanaviewDidAppear:


2
Anche se questo potrebbe funzionare ora, non vi è alcuna garanzia che Apple cambierà comportamento e ti spezzerà in futuro. Quindi quando torni a guardare il tuo codice per provare a risolvere di nuovo le cose, ti chiederai perché stavi facendo questa spedizione apparentemente non necessaria.
Cruinh,

La spedizione con 0 time mi ha già salvato parecchie volte, a volte le cose che dovrebbero funzionare logicamente normalmente non funzionano senza di essa. Quindi fai commenti per te e per gli altri sul perché fai cose non visibili (non solo una tale spedizione) e dovresti stare bene.
Dannie P,

2
Stai solo hackerando il problema e non risolverlo.
Michael Peterson,

0

Funziona per presentare qualsiasi controller di visualizzazione, se hai a disposizione un controller di navigazione. self.navigationController? .present (MyViewController, animato: vero, completamento: zero) Inoltre, posso presentare anche avvisi e controller di posta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.