webentwicklung-frage-antwort-db.com.de

Warnung: Versuch, * on * zu präsentieren, das bereits präsentiert wird (null)

Dies ist meine erste Anwendung für iOS.

Ich habe also eine UIVIewController mit einer UITableView, in die ich eine UISearchBar und eine UISearchController integriert habe, um die anzuzeigenden TableCells zu filtern

override func viewDidLoad() {
    menuBar.delegate = self
    table.dataSource = self
    table.delegate = self
    let nib = UINib(nibName: "ItemCellTableViewCell", bundle: nil)
    table.registerNib(nib, forCellReuseIdentifier: "Cell")

    let searchButton = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: "search:")
    menuBar.topItem?.leftBarButtonItem = searchButton
    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false
        return controller
    })()
    self.table.reloadData()
}

Ich verwende auch ein modales Segment, um die ViewController des Elements zu öffnen, in der Details des Elements angezeigt werden.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.index = indexPath.row
    self.performSegueWithIdentifier("ItemDetailFromHome", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "ItemDetailFromHome") {
        let settingsVC = segue.destinationViewController as! ItemDetailViewController
        settingsVC.parent = self
        if self.isSearching == true  && self.searchText != nil && self.searchText != ""  {
            settingsVC.item = self.filteredItems[self.index!]
        } else {
            settingsVC.item = self.items[self.index!]
        }

    }
}

Das funktioniert gut, bis ich versuche, die ItemDetailViewController für ein gefiltertes Element anzuzeigen (durch die UISearchController).

Ich habe folgende Nachricht:

Warning: Attempt to present <ItemDetailViewController: *>  on <HomeViewController: *> which is already presenting (null)

Zu jeder Zeit gehe ich zur Funktion ItemDetailViewController.viewDidLoad(), aber wenn die Suche aktiviert ist, habe ich den vorherigen Fehler.

Irgendeine Idee ? Ich habe versucht, den folgenden asynchronen Versand zu verwenden, jedoch ohne Erfolg

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.index = indexPath.row
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.performSegueWithIdentifier("ItemDetailFromHome", sender: self)
    })
}
35
Splendf

Ich habe eine Lösung gefunden.

Ich habe den folgenden Code in HomeViewController.viewDidLoad hinzugefügt und das funktioniert!

definesPresentationContext = true
57
Splendf

In meinem Fall habe ich meinen Code gefunden, um den neuen viewController (eine UIAlertController) wurde zweimal aufgerufen.

Überprüfen Sie dies, bevor Sie mit definesPresentationContext herumspielen.

21
grahamparks

In meinem Fall habe ich zu früh versucht, den neuen UIViewController anzuzeigen, bevor der vorherige geschlossen wurde. Das Problem wurde durch einen Anruf mit einer kurzen Verzögerung gelöst:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
     self.callMethod()
}
5
Pavel Kataykin

Das ist mir bei unserem Projekt passiert. Ich präsentierte unser Login/Logout ViewController als Pop-Over. Aber wann immer ich versuchte, mich wieder abzumelden und das Pop-Over wieder anzuzeigen, wurde dies in meiner Konsole abgemeldet:

Warning: Attempt to present UIViewController on <MY_HOME_VIEW_CONTROLLER> which is already presenting (null)

Ich vermute, dass das Pop-Over noch von meinem ViewController gehalten wurde, obwohl es nicht sichtbar war.

Wenn Sie jedoch versuchen, das neue ViewController anzuzeigen, sollte der folgende Code, den ich zur Lösung des Problems verwendet habe, für Sie funktionieren:

func showLoginForm() {

    // Dismiss the Old
    if let presented = self.presentedViewController {
        presented.removeFromParentViewController()
    }

    // Present the New
    let storyboard = UIStoryboard(name: "MPTLogin", bundle: Bundle(for: MPTLogin.self))
    let loginVC = storyboard.instantiateViewController(withIdentifier: "LogInViewController") as? MPTLogInViewController
    let loginNav = MPTLoginNav(rootViewController: loginVC!)
    loginNav.modalPresentationStyle = .pageSheet;
    self.present(loginNav, animated: true, completion: nil)
}
3
Brandon A

In meinem Fall habe ich versucht, eine UIAlertController zu einem bestimmten Zeitpunkt in der App anzuzeigen, nachdem eine UISearchController in derselben UINavigationController verwendet wurde. 

Ich habe die UISearchController nicht korrekt verwendet und habe vergessen, searchController.isActive = false zu setzen, bevor ich sie abstelle. Später in der App versuchte ich, die Warnung anzuzeigen, aber der Suchcontroller kontrollierte den Präsentationskontext, obwohl er zu diesem Zeitpunkt nicht sichtbar war.

2
Clay Ellis

Ich war mit dem gleichen Problem konfrontiert. Was ich getan habe, ist vom Interface Builder, der mein Segment gewählt hat. Seine Art war "Present Modally" und seine Präsentation war "Über aktuellen Kontext".

ich habe die Präsentation in "Default" geändert und dann funktionierte es für mich.

2
Prasanna Kumar

Ich habe das gleiche Problem, als ich versucht habe, ein VC, das im SideMen (jonkykong) aufgerufen hat, zu präsentieren.

zuerst versuchte ich es im SideMenu und ich rief es vom Delegierten zum MainVC auf. Beide hatten das gleiche Problem.

Lösung:Entlasse zuerst das SideMenu und präsentiere das neue VC after will works perfect!

0
Lahiru Pinto

Das Problem für mich ist, dass ich zwei Modale präsentiert habe und beide schließen und dann einen Code im übergeordneten Fenster ausführen muss ... und dann habe ich diesen Fehler ... Ich habe es gelöst, indem ich diesen Code im letzten Fenster gesetzt habe Modal präsentiert:

self.dismiss(animated: true, completion: {
                self.delegate?.callingDelegate()
            })

mit anderen Worten, anstatt nur zwei Mal zu entlassen. Im Abschlussblock des ersten Entlassungsrufdelegierten, der die zweite Entlassung ausführt.

0

Für mich war es eine Warnung, die das neue VC störte, das ich vorstellen wollte.

Also habe ich den neuen VC vorliegenden Code in den OK-Teil meiner Warnung verschoben.

    func showSuccessfullSignupAndGoToMainView(){

    let alert = UIAlertController(title: "Alert", message: "Sign up was successfull.", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
        switch action.style{
        case .default:
            // Goto Main Page to show businesses
            let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
            let vc : MainViewController = mainStoryboard.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController
            self.present(vc, animated: false, completion: nil)

        case .cancel:
            print("cancel")

        case .destructive:
            print("destructive")

        }}))
    self.present(alert, animated: true, completion: nil)
}
0
Zich

Dies hat letztendlich für mich funktioniert, da mein Projekt keine Navigation-VC hatte, sondern einzelne, einzelne VCs. als XIB-Dateien

Dieser Code hat den Fehler erzeugt:

present(alertVC, animated: true, completion: nil)

Dieser Code hat den Fehler behoben:

 if presentedViewController == nil{
        navigationController?.present(alertVC, animated: true, completion: nil)
    }
0
KarmaDeli