7

Ich bin eine modale View-Controller mit einem benutzerdefinierten Übergang präsentiert (durch seine modelPresentationStyle zu UIModalPresentationCustom Einstellung, einen Übergang Delegierten Bereitstellung und UIViewControllerAnimatedTransitioning Objekt).Unwind Segue Entlassung View-Controller nicht mit UIModalPresentationCustom

In dem vorgestellten View-Controller habe ich einen Abwickelschalter, der an eine Taste angeschlossen ist. Der Übergang feuert gerade gut; Die IBAction Methode in der präsentierenden Ansicht Controller wird aufgerufen, und so ist prepareForSegue in der vorgestellten Ansicht Controller. Der dargestellte Ansichtscontroller wird jedoch nicht beendet, und die entsprechende übergeordnete Delegatmethode (animationControllerForDismissedController:) wird nicht aufgerufen.

Wenn jedoch habe ich den präsentierten View-Controller des modalPresentationStyle-UIModalPresentationFullScreen (Standardeinstellung), der View-Controller richtig Feld verwiesen (das bricht ich die benutzerdefinierten Übergang, obwohl).

Ich bin bei einem vollständigen Verlust bei was hier zu tun. Ich habe mir die Dokumentation von Apple angeschaut und nichts bemerkt, dass man beim Umgang mit benutzerdefinierten Übergängen besondere Dinge mit Abwicklungssträngen zu tun hatte.

Ich bin mir bewusst, dass ich dismissViewControllerAnimated:completion: in der IBAction Methode des präsentierenden View-Controllers anrufen könnte, aber ich würde das lieber als letzten Ausweg nutzen, und den Abwickel-Modus so arbeiten lassen, wie er sollte (oder zumindest wissen warum es nicht funktioniert :)).

Jede Hilfe wäre

, sehr geschätzt werden

Vielen Dank im Voraus

+1

ich das gleiche Problem habe, hast du es jemals lösen, ohne zu dismissViewControllerAnimated greifen: Abschluss? – Chris

+2

Hey Chris, ich habe es gelöst, aber um ehrlich zu sein kann ich mich nicht wirklich daran erinnern wie. Wie Sie wahrscheinlich bemerkt haben, habe ich diese Frage vor ein paar Monaten gestellt, und seitdem haben wir den Übergang entfernt. Ich scheine mich zu erinnern, dass ich in presentationController "adaptivePresentationStyle" überschrieben und "UIModalPresentationOverFullScreen" zurückgegeben habe. I_think_ Dies hat den gleichen Effekt wie das Setzen des 'modalPresentationStyle' auf dem VC, erlaubt aber immer noch den benutzerdefinierten Übergang. Entschuldigung, ich kann nicht mehr helfen. – baxterma

+0

Haben genau dasselbe Problem. Alles gut mit dem gegenwärtigen Übergang und dem benutzerdefinierten gegenwärtigen Übergang. Aber die Abwicklungssequenz schlägt vollständig fehl. Nicht entlassen, geschweige denn den benutzerdefinierten Übergang ablehnen. Genauso wie du selbst, kann ich das Abwicklungssegment mit einem disneyViewControllerAnimated ersetzen. Das löst das Problem. Aber es ist nicht ideal, da ich es vorziehen würde, durchweg durchgängig Segmente zu verwenden –

Antwort

1

Es scheint, dass, wenn Sie UIModalPresentationCustom verwenden Sie den Controller mit einem benutzerdefinierten Übergang Manager zu präsentieren, müssen Sie auch einen benutzerdefinierten Übergang Manager verwenden, um zu entlassen es (was sinnvoll ist, denke ich, da Sie alle Arten von seltsamen Sachen im Animator-Objekt tun können und UIKit kann nicht sicher sein, dass nur den Bildschirm wie üblich zu verlassen vollständig den ursprünglichen Zustand wiederherstellen wird - ich wünschte nur, dass es Ihnen das explizit gesagt ...).

Hier ist, was ich in meiner App zu beheben dies getan:

  • Überschreibung segueForUnwindingToViewController in den übergeordneten View-Controller (derjenige, zu dem Sie nach der entlassenen Animation in Bewegung sind) und gebe eine Instanz Ihres UIStoryboardSegue, entweder die, die Sie für den ursprünglichen Übergang oder eine neue separate Klasse
  • , wenn der Abwickler segue Ziel view-Controller in einer Navigationshierarchie verwendet haben, dann müssen Sie diese Methode in der Navigation-Controller statt
  • in außer Kraft setzen der perform Methodenaufruf dismissViewControllerAnimated
  • Der dargestellte View-Controller muss immer noch einen gültigen Verweis auf den übergehenden Delegaten halten, sonst erhalten Sie eine EXC_BAD_ACCESS (siehe DismissViewControllerAnimated EXC_Bad_ACCESS on true) - entweder wird der Delegat als starke Referenz beibehalten, wie in diesem Thread beschrieben, oder Weisen Sie vor dem Aufruf von dismissViewControllerAnimated eine neue Nummer zu (es ist möglich, dass modelPresentationStyle in z Vollbild vor Entlassung funktionieren würde, aber ich habe nicht versucht, dass)
  • wenn die entlassene Animation alle Nicht-Standard-Dinge tun muss (mein glücklicherweise nicht), außer Kraft setzt animationControllerForDismissedController im Übergang Manager-Objekt und gibt ein ordnungsgemäßen Animator
  • Wenn sich der Zielansicht-Controller in einer Navigationshierarchie befindet, müssen Sie den Navigations-Stack auch manuell auf den Ziel-Controller laden, bevor Sie den angezeigten Bildschirm schließen (d. htarget.navigationController!.popToViewController(target, animated: false))

komplettes Codebeispiel:

// custom navigation controller 

override func segueForUnwindingToViewController(toViewController: UIViewController, 
fromViewController: UIViewController, 
identifier: String?) -> UIStoryboardSegue { 
    return CustomSegue(
     identifier: identifier, 
     source: fromViewController, 
     destination: toViewController 
    ) 
} 


// presented VC 

var customTransitionManager: UIViewControllerTransitioningDelegate? 


// custom segue 

override func perform() { 
    let source = sourceViewController as! UIViewController 

    if let target = destinationViewController as? PresentedViewController { 
     let transitionManager = TransitionManager() 
     target.modalPresentationStyle = .Custom 
     target.customTransitionManager = transitionManager 
     target.transitioningDelegate = transitionManager 

     source.presentViewController(target, animated: true, completion: nil) 
    } else if let target = destinationViewController as? WelcomeViewController { 
     target.navigationController!.popToViewController(target, animated: false) 
     target.dismissViewControllerAnimated(true, completion: nil) 
    } else { 
     NSLog("Error: segue executed with unexpected view controllers") 
    } 
} 
Verwandte Themen