Schermo nero dopo la presentazione di modal view controller nel contesto attuale da UITabBarController

Mia root view controller è un UITabBarController. Sto cercando di presentare un modal view controller su una tab bar controller view controller, ma consentono ancora la tab bar per essere utilizzato per andare a una scheda diversa – in altre parole, vorrei che il modale solo per interrompere il flusso di quella particolare scheda, non l’intero app.

Per fare questo, ho impostato la presentazione di vista del controller stile di presentazione come ‘Più di Contesto Corrente’ in storyboard. Il problema che sto avendo è che dopo aver presentato il modal view controller e la selezione di una nuova scheda, la presentazione di vista del controller di vista viene rimosso dalla finestra, e non viene aggiunto alla finestra, in caso di rigetto presentato view controller. Dopo aver respinto la vista, il controller di movimento per un’altra scheda e poi tornare, infine, mette la presentazione view controller indietro nella finestra.

Ho riprodotto il mio problema con le ‘Schede’ modello in Xcode.

Schermo nero dopo la presentazione di modal view controller nel contesto attuale da UITabBarController

Dopo la presentazione di modal – ho aggiunto la trasparenza presentato view controller facilmente vedere che cosa sta succedendo nella presentazione view controller.

Schermo nero dopo la presentazione di modal view controller nel contesto attuale da UITabBarController

Cambiare a seconda scheda e poi di nuovo – la presentazione di vista del controller di vista è stato ora rimosso.
Schermo nero dopo la presentazione di modal view controller nel contesto attuale da UITabBarController

Di rigetto, modale lascia la presentazione view controller con vista ancora rimosse dalla finestra. Andando tab 2 e il ritorno aggiunge la visualizzazione torna alla finestra.
Schermo nero dopo la presentazione di modal view controller nel contesto attuale da UITabBarController

Sto sperando che questo è qualcosa di semplice, ho trascurato in storyboard, ma il fatto che sono in grado di presentare modale e vedere l’presentato view controller dietro di esso prima di cambiare schede mi fa pensare di avere impostato le cose in modo corretto.

  • Puoi spiegare perché si desidera in modo da questo? Normalmente, una modal view controller in questo contesto può essere utilizzato per eseguire alcune azioni relative a tale scheda e deve essere respinto, mentre ancora all’interno della scheda. Se si ha realmente bisogno che vista (quello che si è scelta obbligatoria la presentazione di rimanere visibile, si potrebbe desiderare di utilizzare un controller di navigazione come la radice di quella scheda, e fare un push, invece.
  • Si prega di inviare il codice da utilizzare per la presentazione così come chiudere l’modale viewController
  • Per eseguire un’azione, relative alla scheda, esattamente come lei ha detto. Ogni scheda è separato il flusso di lavoro – modale interrompe il flusso di lavoro della scheda, ma la sua perfezione per l’utente di passare a un’altra scheda e la visualizzazione di informazioni non correlate alla scheda che mostra il modale.
  • la sua presentati da uno storyboard modale segue. Il suo solo respinto, con [self dismissViewControllerAnimated:true completion:nil]
  • Provare a rimuovere il collegamento trigger da storyboard e chiamarla con un altro codice.
  • Hai trovato la soluzione?

 

8 Replies
  1. 36

    Ho avuto lo stesso problema ed era in grado di risolvere impostando self.definesPresentationContext = YES; sulla presentazione view controller prima di presentare modale, VC. È anche possibile impostare questo in uno storyboard, la casella di controllo è chiamato “Definisce il Contesto” in Interface Builder.

    • Non funziona affatto
    • Nop. Non funziona su iOS 10 e superiori.
  2. 15

    Provare a impostare il proprio stile di presentazione come ‘Oltre il Full Screen’ invece di ‘Sopra la Corrente Contesto’ in storyboard.
    Schermo nero dopo la presentazione di modal view controller nel contesto attuale da UITabBarController

    • Questo dovrebbe essere accettato risposta!!! Salvato il mio giorno.
    • Funziona per me. Grazie bro
    • Salvato la mia giornata..!!
    • Si sono superman…..
    • Non è lo stesso sia nella gestione di memoria e VCs gerarchia. E ‘ la soluzione di un problema in una sola (presentazione a schermo intero) caso non in una generica soluzione
    • Grazie , questo codice in esecuzione

  3. 13

    iOS 10+ & Swift 3+

    Ho molto bella soluzione di questo problema. Utilizzare, oltre a schermo intero modale stile di presentazione per un view controller, viene presentato.

    let storyboard = UIStoryboard(name: "Main", bundle: nil)  //Replace “Main” with your storyboard name
    
    if let viewController = storyboard?.instantiateViewController(withIdentifier: viewController Identifier”) as? ViewController {
                viewController.modalPresentationStyle = .overFullScreen
                self.present(viewController, animated: false, completion: { 
                })
            }

    Su schermo intero presenterà il view controller sopra il vostro tabbar (controller) coprendo. Così, l’utente finale non può cambiare tabbar (a meno che non si esegue l’operazione a livello di programmazione) tabbar elementi. L’utente deve chiudere questa view controller per passare tabbar.

    Se si utilizza segue, per presentare view controller, quindi selezionare “Oltre il Full Screen’ da modale stile di presentazione in Attributo di ispezione

  4. 6

    Tenta di presentare il controller di visualizzazione nella finestra dell’applicazione. Ho avuto un problema simile che è stato fissato dal codice sotto:

        let myNewVC = mainStoryBoard.instantiateViewController(withIdentifier: "MyNewVCId") as! MyNewVC
        let navController = UINavigationController(rootViewController: myNewVC)
        navController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext    
    
        let appDelegate = UIApplication.shared.delegate as? AppDelegate
        appDelegate?.window?.rootViewController?.present(navController, animated: true, completion: nil)

    Spero che questo ti aiuta troppo.

    • lasciate che appDelegate = UIApplication.comune.delegato! AppDelegate
    • Ciao devo usare il metodo push non funziona per il presente funziona ? qualsiasi soluzione
  5. 5

    Ho riprodotto il problema e trovare una soluzione.
    Non comporta la modifica dell’segue il metodo o la modifica di alcuni attributi di storyboard.

    Suggerimento:

    Ma prima di andare per la soluzione vorrei aggiungere che lo scopo della funzione modale presentato viewcontrollers è distrupt il flusso effettivo di app e presenti alcuni extra informazioni contestuali o qualche fruibili i contenuti per la presentazione di vc. Messo semplicemente è molto logico, e in realtà consiglia di coprire la barra delle schede quando si presenta un controller di visualizzazione a scelta obbligatoria. Ci sono un sacco di buoni esempi in app store.

    Detto che qui è una soluzione che io propongo.

    Soluzione:

    Credo che il problema risiede nel modo in cui UITabBarController gestisce la sua gerarchia della vista.

    Cosa che ho fatto è stato esplicitamente respingere il modale presentato view controller prima che la scheda è stato cambiato. Questo ha reso la presentazione view controller persistono in vista della gerarchia delle UITabBarViewController prima la scheda di bar passa alla nuova scheda.

    In “viewWillDisappear” metodo a vostra scelta obbligatoria presentato ViewController aggiungere questo.

    - (void)viewWillDisappear:(BOOL)animated {
        [self dismissViewControllerAnimated:true completion:^{
        [super viewWillDisappear:animated];
      }];
    }
    • Questa risposta per me ha funzionato molto bene!
    • Lo ha fatto descrivere il problema. Così ho cambiato segue da push-to-modale e ha funzionato.
    • Questo punto è estremamente importante: la presentazione di VC non persistere nella gerarchia SE l’utente apre questa SCHEDA si passa ad un’altra SCHEDA e poi torna alla SCHEDA A. Se poi si elimina l’modale si ottiene la schermata nera della morte.
  6. 5

    ho avuto questo problema : quando presento il mio ModalController prende sfondo trasparente e quando ho cambiato la scheda per la prossima nel tabBarController e getBack a precedente lo sfondo trasparente è stato andato e c’è un cattivo sfondo nero dopo una ricerca ho trovato il punto, il punto è questo:

    auto.definesPresentationContext = true

    l’auto non è modale controller di sé è che la presentazione di controller per modalController e un altro punto .overCurrentContext come questo

    ** self.definesPresentationContext = true **
    modalController.modalPresentationStyle = .overCurrentContext
    self.present(modalController, animated: true, completion: nil)

  7. 1

    Avendo un problema simile con la mia scheda controller, tuttavia, come i commenti, mi suggeriscono di cambiare la segue per una spinta o una mostra segue. Questo permetterà che la scheda di restare in contatto con la nuova visualizzazione in luogo delle vecchie vista quando si passa ad altre schede. Se l’estetica è un problema si può personalizzare il controller di navigazione per personalizzare l’aspetto della nuova vista.

  8. 0

    Ho lo stesso problema attualmente vivo swift progetto. Ho fatto soluzione alternativa che.

    Poi finalmente ho usato NSNotificationCenter e respingere che view controller quando la scheda è cambiata per risolvere questo problema.

    Ho fatto riferimento tabbar controller AppDelegate e set di delegare c’.

    let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    
    let tabbarcontroller = storyboard.instantiateViewControllerWithIdentifier("MyTabBarController") as! UITabBarController
    
    tabbarcontroller.delegate = self

    E delegare

    //MARK: - Tabbar controller delegate
    
    extension AppDelegate : UITabBarControllerDelegate {
    
        func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    
            NSNotificationCenter.defaultCenter().postNotificationName("TabBarTabChanged", object: nil)
        }
    }

    Poi devo aggiungere osservatore nel mio presentati view controller come

    override func viewDidLoad() {
            super.viewDidLoad()
    
            //Do any additional setup after loading the view.
            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PreviewPlaceVC.BackClickAction(_:)), name: "TabBarTabChanged", object: nil)
    }
    
    //MARK: - Button Click Actions
    
    @IBAction func BackClickAction(sender: AnyObject) {
         self.dismissViewControllerAnimated(true, completion: nil)
    }

    E funziona bene per me. Non è una soluzione adeguata credo che per chiudere view controller su scheda evento di modifica, ma è ok per chiudere piuttosto che a schermo nero che rompe anche la navigazione in quel momento.

Lascia un commento