2016-05-02 11 views
0

ich eine Klasse habe einen UIPopoverPresentationController in einer leeren swift-Datei zu erstellen:PopoverPresentationController Delegatmethoden genannt nicht

import Foundation 
import UIKit 

class Popovers : NSObject, UIPopoverPresentationControllerDelegate { 

    func presentLoginScreen() { 
     // Presenting login Popover 

     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     let loginScreen = storyboard.instantiateViewControllerWithIdentifier("LogInScreen") 

     let window = UIApplication.sharedApplication().windows.last! 
     let height = window.screen.bounds.size.height 
     let width = window.screen.bounds.size.width 

     loginScreen.modalPresentationStyle = UIModalPresentationStyle.Popover 
     loginScreen.preferredContentSize = CGSizeMake(width * 0.85 , height * 0.35) 

     let loginScreenPopover = loginScreen.popoverPresentationController 
     loginScreenPopover?.permittedArrowDirections = UIPopoverArrowDirection.init(rawValue: 0) 
     loginScreenPopover?.delegate = self 
     loginScreenPopover?.sourceView = window.rootViewController?.view 
     loginScreenPopover?.sourceRect = CGRectMake(CGRectGetMidX(window.screen.bounds), CGRectGetMidY(window.screen.bounds), 0, 0) 

     window.rootViewController?.presentViewController(loginScreen, animated: true, completion: nil) 

     let blur = UIVisualEffectView(effect: UIBlurEffect(style: .Light)) as UIVisualEffectView 
     let bounds = window.screen.bounds 
     blur.frame = bounds 
     blur.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] 
     window.rootViewController!.view.addSubview(blur) 

    } 

    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { 
     return UIModalPresentationStyle.None 
    } 

    func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) { 
     // Remove blur layer 
     print("method called") 
     let window = UIApplication.sharedApplication().windows.last 
     window?.subviews.last?.removeFromSuperview() 


    } 


} 

Aber immer, wenn ich den PopoverPresentationController die Methode delegiert entlassen popoverPresentationControllerDidDismissPopover wird nie ausgelöst.

Ich habe den Delegaten von LoginScreenPopover auf self gesetzt und die Popovers-Klasse von UIPopoverPresentationControllerDelegate erben lassen, aber keiner scheint zu funktionieren.

Es ist auf einem iPhone, wenn das für die Frage relevant ist.

+1

Wie haben Sie den 'popOverController' abgeschaltet? Wenn Sie es programmgesteuert ablehnen, wird 'func popoverPresentationControllerDidDismissPopover' nicht ausgelöst – luiyezheng

+0

Ich habe es nicht programmatisch abgewiesen, ich klopfte außerhalb der Popover-Ansicht – Emptyless

+0

Für mich war das Problem, dass das Aufrufen des PopoverViewController durch ein" PerformSegue "immer ignorierte die Delegierten. Das Löschen des Storyboard-Segments und das manuelle Zusammenstellen und Anzeigen durch den presentViewController löste es. – Alexandre

Antwort

0

Ich habe die Antwort gefunden. Im ViewDidLoad() aus der Login habe ich die Delegierten zu:

self.popoverPresentationController.delegate = getPopovers() 

Wo die getPopovers() Funktion eine Funktion ist, das Popover Objekt erstellt irgendwo anders im Code abgerufen werden. Jetzt in meiner Popovers-Klasse kann ich dem UIPopoverPresentationControllerDelegate entsprechen und diese Methoden verwenden.