2016-09-23 10 views
0

ポップオーバービューコントローラをプログラムで終了します。どのように私は最初のビューコントローラでそれを検出することができますか? popoverから最初の値に値を送る方法はありますか? 注:popoverPresentationControllerDidDismissPopoverは、プログラムによって終了したときには機能しません。 提案はありますか?プログラムでポップオーバーを解除することを検出しません

これは、メインビューコントローラでの私のコードです:

let addFriendsPopoverViewController = storyboard?.instantiateViewControllerWithIdentifier("HomeEmotionPopOver") as! EmotionPopOverViewController 
    addFriendsPopoverViewController.modalInPopover = true 
    addFriendsPopoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover 
    addFriendsPopoverViewController.preferredContentSize = CGSizeMake(100, 100) 
    let popoverMenuViewController = addFriendsPopoverViewController.popoverPresentationController 
    popoverMenuViewController!.permittedArrowDirections = .Any 
    popoverMenuViewController!.delegate = self 
    popoverMenuViewController!.sourceView = self.view 
    let height = (self.tableView.rowHeight - HeartAttributes.heartSize/2.0 - 10) + (self.tableView.rowHeight * CGFloat((sender.view?.tag)!)) - 50 
    popoverMenuViewController!.sourceRect = CGRect(
     x: 30, 
     y: height, 
     width: 1, 
     height: 1) 
    presentViewController(
     addFriendsPopoverViewController, 
     animated: true, 
     completion: nil) 

とポップオーバービューコントローラでは、私がボタンIBActionからそれを却下しています:あなたは言葉で表現している

 @IBAction func dismissPop(sender: AnyObject) { 
    self.dismissViewControllerAnimated(true, completion: nil) 

} 
+0

トラブルを再現できるようにコードを投稿してください。 – pedrouan

+0

私はちょうど私のポストを編集しました、あなたの助けをありがとう –

+0

ポップオーバーの中のボタンからポップオーバーが閉じているのですか? – pedrouan

答えて

1

方法あなたの質問は、ポップオーバーが解除されたときに呼び出されるメインビューコントローラ上の関数を探していることです。

これは技術的にはviewDidAppear(animated:)で発生します。しかし、それは完全な解決策ではありません。あなたのポップオーバーが全画面のコンテキストをカバーしていない場合、この関数は起動しませんので、信頼できない解決策です。

本当に必要なのは、ポップオーバーから関数を呼び出して、メインビューコントローラに終了/終了したことを通知することです。これは簡単にデリゲートプロトコルで行われ

protocol PopoverDelegate { 
    func popoverDismissed() 
} 

class PopoverViewController { 
    weak var delegate: PopoverDelegate? 

    //Your Popover View Controller Code 
} 

は、その後、あなたがメインビューコントローラなるようにポップオーバーのためにデリゲートを設定する必要があなたのメインビューコントローラ

class MainViewController: UIViewController, PopoverDelegate { 
    //Main View Controller code 
} 

に、プロトコルの適合性を追加します。

let addFriendsPopoverViewController = storyboard?.instantiateViewControllerWithIdentifier("HomeEmotionPopOver") as! EmotionPopOverViewController 
addFriendsPopoverViewController.delegate = self 
//The rest of your code 

最後に、ディスパッチするときにポップオーバービューコントローラからこの代理関数を呼び出します。

@IBAction func dismissPop(sender: AnyObject) { 
    dismissViewControllerAnimated(true, completion: nil) 
    delegate?.popoverDismissed() 
} 

そして、あなたのメインビューコントローラでは、デリゲートメソッドを実装

func popoverDismissed() { 
    //Any code to run when popover is dismissed 
} 
+0

あなたの高速回答ありがとうが、私はポップオーバーのメインビューコントローラにするための代理人を設定することはできません。私はエラーが表示されます:メインビューコントローラに代理人を割り当てることができません... –

+0

メインビューコントローラにプロトコル準拠を追加しましたか?これを行う方法を示すために私の答えにサンプルコードを追加しました。 – ColdLogic

+0

ありがとう!そして、私は変数値をポップオーバーからメイン変数に送ることをどのように提案しますか? –

1

トリックはセグエを自分で消すが、それはデリゲートによって検出することができるので、ユーザはそれを開始したように見えるようにすることです方法popoverPresentationControllerDidDismissPopover()

私は、presentingViewController dismiss()関数に完了クロージャを追加し、ルーチンを直接呼び出しました。

if let pvc = self.presentingViewController { 
    var didDismiss : ((UIPopoverPresentationController) -> Void)? = nil 
    if let delegate = popoverPresentationController?.delegate { 
     // check it is okay to dismiss the popover 
     let okayToDismiss = delegate.popoverPresentationControllerShouldDismissPopover?(popoverPresentationController!) ?? true 
     if okayToDismiss { 
      // create completion closure 
      didDismiss = delegate.popoverPresentationControllerDidDismissPopover 
     } 
    } 
    // use local var to avoid memory leaks 
    let ppc = popoverPresentationController 
    // dismiss popover with completion closure 
    pvc.dismiss(animated: true) { 
     didDismiss?(ppc!) 
    } 
} 

私にとってはうまくいっています。

関連する問題