2015-11-01 17 views
7

Sto aggiornando un'applicazione per utilizzare gli storyboard universali. Ho creato un popover seguito a un nuovo viewcontroller utilizzando l'interfaccia builder trascinando da un pulsante al mio nuovo viewcontroller e selezionando "Present As Popover" come il tipo di seguito.Come rilevare quando un popover viene rimosso in iOS 9

Quando l'utente preme all'esterno del popover (congedandolo), devo essere avvisato nel controller di visualizzazione presentando così posso annullare le loro azioni. Come posso fare questo?

Normalmente avrei creato il popover manualmente e ho reso il mio viewcontroller il delegato del popover; permettendomi di usare la chiamata del delegato popoverControllerDidDismissPopover. Tuttavia, questo è deprecato in iOS9 e anche se non fosse non ho idea di dove trovare il popover in modo da poter impostare il suo delegato al mio controller di visualizzazione.

risposta

9

Non è sicuro quale metodo si sta definendo deprecato ma è comunque possibile utilizzare lo UIPopoverPresentationControllerDelegate per ottenere ciò. Qualcosa di simile:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "popoverSegue" { 
     let vc = segue.destinationViewController 
     sortVC.modalPresentationStyle = .Popover 
     sortVC.popoverPresentationController?.sourceRect = filterButton.bounds 
     sortVC.preferredContentSize = CGSizeMake(216, 150) 
     sortVC.popoverPresentationController!.delegate = self 
    } 
} 

e quindi utilizzare il metodo di

func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) 

per gestire il suo licenziamento.

+2

Ricordare che la funzione didismis viene chiamata solo quando il popover si congeda da solo, come un tocco esterno. Se lo licenzi tu stesso con il tuo codice personale (da un pulsante, ad esempio), non verrà chiamato. – CMash

4

Il metodo popoverControllerDidDismissPopover: è stato sostituito da popoverPresentationControllerShouldDismissPopover: perché è stato sostituito da UIPopoverPresentationControllerDelegate.

Dal tuo controller di vista presentazione, conformi al nuovo protocollo e impostare il delegato per il controller presentazione popover in prepareForSegue::

class MyPresentingViewController: UIViewController, UIPopoverPresentationControllerDelegate { 

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

    func popoverPresentationControllerShouldDismissPopover(popoverPresentationController: UIPopoverPresentationController) -> Bool { 
     return true 
    } 
} 

È possibile quindi utilizzare il metodo delegato per gestire il rilevamento del licenziamento nel modo che avevi precedentemente intenzione.