2016-01-26 10 views
16

Ich habe einen View-Controller, der in einem Popover mit einem Storyboard-Segment präsentiert wird.Storyboard Popover entlassen, Delegate Methoden nicht aufgerufen

enter image description here

In dem präsentierenden View-Controller, ich den folgenden Code hatte:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let svc = segue.destinationViewController as? SettingsViewController { 
     svc.popoverPresentationController?.delegate = self 
    } 
} 

stellt sich jedoch, dass die präsentierten View-Controller aus, auch wenn es als popover erscheint, hat eine modalPresentationStyle von '.Modal und daher ein nilpopoverPresentationController. Seltsam!

Also, ich den Code wie folgt aktualisiert:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let svc = segue.destinationViewController as? SettingsViewController { 
     svc.modalPresentationStyle = .Popover 
     svc.popoverPresentationController?.delegate = self 
    } 
} 

Der svc.popoverPresentationController Delegierten jetzt eingestellt OK, aber wenn der popover vom Benutzer des Feldes verwiesen Klopfen außerhalb keiner der UIPopoverPresentationControllerDelegate Delegatmethoden (zB popoverPresentationControllerShouldDismissPopover sind .?. genannt Was bin ich

+0

Wahrscheinlich eine dumme Frage, sind Sie sicher, dass der Übergang als „Geschenk gesetzt als Popover "im Storyboard? –

+0

Ja, definitiv - und es stellt sich korrekt als Popover dar (und tat sogar vor dem Setzen von 'svc.modalPresentationStyle = .Popover'). Lohnt sich aber zu prüfen! –

+0

Eine Sache ist seltsam, sollte es "Present as Popover" sagen, wie nur "Popover" sollte veraltet sein, aber ich glaube nicht, dass das das Problem ist ... –

Antwort

7

in diesem Fall Delegation Keine Notwendigkeit für Wenn die presentingViewController (was auch immer vc das popover ist enthalten) nur überschreibt:

override func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) { 
    // Before calling super get a handle on which controller is being dismissed 
    print("Dismiss: \(self.presentedViewController)") 
    super.dismissViewControllerAnimated(flag, completion: completion) 
} 

Sie werden benachrichtigt, egal wie es entlassen wird. Sie müssen auch keine zusätzlichen Variablen/Einstellungen in der prepareForSegue: setzen (zumindest um diese Interaktion zu bewältigen).

+0

Es ist die einzige Antwort, also hol dir die Belohnung. Scheint aber nicht richtig, irgendwie –

+0

@AshleyMills neugierig, warum Sie nicht so denken? Mit der Tendenz zu Popovers, Alarmen und Action Sheets, die tatsächliche Container sind (ab iOS 8), im Gegensatz zu ihren eigenen unabhängigen View-Elementen (z. B. Windows), macht es tatsächlich wirklich Sinn. Ein Popover funktioniert jetzt genauso wie ein normaler VC. – Firo

+0

Sorry, nicht in dem Sinne, dass du eine schlechte Antwort warst.Nur dass ich gehofft hatte, dass jemand wissen würde, warum die popoverPresentationControllerDelegate-Methoden nicht gefeuert wurden. Und in meinem Fall wird das Popover von einem UIBarButtonItem in der Navigationsleiste dargestellt, daher benötigt der navController Subclassing, um Ihre Lösung zu implementieren –

0

lief in das gleiche Problem und nach durch die Dokumentation zu lesen, erkannte ich, dass Sie anrufen müssen:

[self presentViewController:myPopoverViewController animated: YES completion: nil];

, um für die Delegatmethoden genannt werden.

Der vollständige Code-Schnipsel ist wie folgt und laufen in meiner - (void) prepareForSegue: Absender-Methode:

// Present the view controller using the popover style. 
myPopoverViewController.modalPresentationStyle = UIModalPresentationPopover; 
[self presentViewController:myPopoverViewController animated: YES completion: nil]; 

// Get the popover presentation controller and configure it. 
UIPopoverPresentationController *presentationController = 
     [myPopoverViewController popoverPresentationController]; 
presentationController.permittedArrowDirections = 
     UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionRight; 
presentationController.sourceView = myView; 
presentationController.sourceRect = sourceRect; 

https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller

Verwandte Themen