2017-12-31 116 views
1

Ich habe ein Problem mit einer App, die ich entwickle.Beim Anzeigen modal über aktuellen Kontext, beim Abwickeln, ruft viewDidAppear nicht

  • XCode-Version: 9.2 (9C40b)
  • Programmiersprache: Swift 4
  • Ziel iOS-Version für die App: 11,2

Szenario: Ich habe eine mainVC (Viewcontroller), die ruft ein modal präsentiertes secondaryVC auf. Nachdem ich eine Auswahl in der sekundärenVC getroffen habe, drücke ich eine UIB-Taste, um über einen Abwicklungs-Abschnitt zum Haupt-VC zurückzukehren.

Im secondaryVC, Übergang wird als „Cross aufloesen“ und Präsentation konfiguriert, als „Over Current Context“ die vorherige Ansicht als Hintergrund zu erhalten (siehe Hintergrund mit 50% Opazität konfiguriert ist):

enter image description here

Symptom: In diesem Szenario wird viewDidAppear nie aufgerufen, wenn das Abwicklungssegment zurückgeht. Ich muss es für weitere auszuführende Prüffunktionen aufrufen. Es wird aufgerufen, wenn statt "Over Current Context" die Präsentation als "Vollbild" eingestellt wird, aber in diesem Fall kann ich die vorherige Ansicht nicht als Hintergrund sehen.

Frage: Wie kann ich ViewDidApper aufgerufen werden, behalten einige Transparenz auf der sekundärenVC über die MainVC?

PS: Tut mir leid, wenn ich etwas verpasst habe, als ich diese Frage geschrieben habe; es ist mein erstes. Ich habe dieses und andere Foren durchsucht und keine Lösung gefunden (oder ich habe sie nicht identifiziert).

+0

Vielleicht vermisse ich etwas von Ihrer Frage, aber in Bezug auf 'viewDidAppear' würde ich erwarten, dass es * einmal * pro View-Controller * genannt wird, wenn * sie erscheinen.Da es sich um ein * devel * Segment einer modal präsentierten VC handelt, würde ich erwarten, dass 'viewWillDisappear' und dann' viewDidDisappear' alles sind, was ausgelöst würde, nur für die zweite VC. – dfd

+0

Eigentlich habe ich nicht überprüft, ob viewWillDisappear oder viewDidDisappear in der secondaryVC aufgerufen wurden. Aber das Problem ist, dass ich eine Warnung basierend auf einigen Nachprüfungen auslösen möchte, und diese passieren auf der Basis von Daten in der MainVC, so dass ich in Erwägung zog, diese Aufgabe (Überprüfung und Alarmierung) auf die sekundäre zu verschieben, ist kein guter Ansatz. Tatsächlich habe ich noch zwei sekundäreVCs, die Daten zu mainVC bringen. – Markussen

+0

Klingt so, als müssten Sie den ** vollständigen ** Lebenszyklus betrachten und von dort aus weitergehen. Hier ist * meine * Referenz von hier: https://stackoverflow.com/questions/5562938/looking-to-understand-the-ios-uiviewcontroller-lifecycle#12608364 – dfd

Antwort

0

Der Grund, warum viewDidAppear nicht aufgerufen wird, liegt daran, dass der erste View-Controller niemals verschwindet. Wenn Sie 'Over Current Context' verwenden, können Sie den View-Controller immer noch hinter dem View-Controller 2 sehen (vorausgesetzt, es gibt transparente Bereiche wie Sie). View Controller bleibt also sichtbar, verschwindet nie und wenn View Controller 2 angezeigt wird, wird also weder viewWillDisappear noch viewDidDisappear aufgerufen. Dann verschwindet der zweite View-Controller, aber die Faust erscheint nicht, so dass viewWillAppear und viewDidAppear nicht aufgerufen werden.

Wenn Sie "Vollbild" verwenden, verschwindet der erste View-Controller und damit alle Funktionen.

Wenn Sie etwas tun müssen, wenn der zweite View-Controller verschwindet und Sie zum ersten View-Controller zurückkehren, können Sie ihn in die Abwicklungsfunktion setzen.

EDIT

Dies ist ein Trick, einige Codes auszuführen wie eine Warnung View-Controller von einem Abwickelstation segue Anzeige:

DispatchQueue.main.async { 
     let ac = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert) 
     ac.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil)) 
     self.present(ac, animated: true, completion: nil) 
    } 

Im Grunde, was das getan hat, ist der erforderlichen Code zurück auf den Schub Haupt-Thread und es passiert, nachdem die Abwicklungssequenz abgeschlossen ist und Sie wieder in der ersten Ansicht Controller sind.

+0

Ich kam zu dieser Schlussfolgerung, aber es ist irgendwie verwirrend für mich Obwohl du das MainVC auf der Rückseite von secondaryVC sehen kannst, rufst du secondaryVC an, so dass das hinterste (mainVC) dahinter verschwindet. Um dies zu verdeutlichen: Der Grund, warum ich zu diesem Problem kam, ist, dass ich einige Überprüfungen nach kommen von secondaryVC durchführen muss, und wenn es ein Problem gibt, möchte ich eine Warnung auf MainVC (wie MainVC enthält alle Daten)). Wenn ich die Warnung im Abwicklungs-Segment aufruft, wird ein Fehler angezeigt, der besagt, dass ich noch nicht von secondaryVC zurückgekehrt bin, sodass die Warnung nicht ausgelöst werden kann. – Markussen

+0

Nun, es gibt einen Trick, den Sie tun können, um dieses Problem zu überwinden, und ich werde meine Antwort aktualisieren, um Ihnen zu zeigen. –

+0

Vielen Dank Upholder. Ich habe es noch nicht ausprobiert, da ich an anderen Funktionen meiner App weiter arbeitete. Für jetzt speichern ich diese Antwort, damit ich einen Test für später zurückkommen kann. PS: Ich habe uplooted, aber ich habe nicht genug rep für das. – Markussen

Verwandte Themen