2014-01-12 12 views
12

私はpopoverオブジェクトをcontentViewControllerに割り当てて、コンテンツビューコントローラにあるボタンにdismissコードを配置します。UIPopoverControllerデリゲートが呼び出されても呼び出されないようにする

[self.popover dismissPopoverAnimated:YES]; 

が呼び出され、ポップオーバーが却下されています。ボタンが押された

ただし、デリゲートのメソッドは自動的に呼び出されません。私はそれが代理人であるとは思っていませんでしたが、そこにあります。私はdismissPopoverAnimated行の後に次の行を追加すると、デリゲートは、それが「自動的に」デリゲートのメソッドを呼び出していない理由を私は理解していない

[self.popover.delegate popoverControllerDidDismissPopover:self.popover]; 

...正しく呼び出されます。 これはどうしてできますか?

+0

私はあなたがプロトコルの代議員について話していると思いますか?それがどのように機能するのですか?デリゲートに対してプロトコルで定義されたメソッドを実行させたい場合は、[delegate protocolMethod]を使用してデリゲートに明示的に指示する必要があります。メソッドを実行したい場所に移動します。あなたのプロトコルに10のメソッドがあったとしたらどうでしょうか?このシナリオでは、デリゲートが10のすべてのメソッドを正しく実行する必要はありませんか?だから、ただ一つのメソッドしか定義されていなくても、呼び出すメソッドを推測することはできません。 – Zhang

+0

通常、dismissPopoverAnimatedメソッドを使用すると、popoverが終了した後に自動的にpopoverControllerDidDismissPopoverメソッドが呼び出されます。それが、UIPopoverControllerが解雇について今私たちに教える方法です。 – frankish

+0

可能な複製[UICopoverControllerを-dismissPopoverAnimatedで却下する:代理人を呼び出さない?](http://stackoverflow.com/questions/3567033/dismissing-uipopovercontroller-with-dismisspopoveranimated-wont-call-delegate) –

答えて

16

'dismissPopoverAnimated:'が使用されている場合、代理人のpopoverControllerDidDismissPopover:は呼び出されません。 UIPopoverControllerDelegatepopoverControllerDidDismissPopover:ためApple Documentationから

:方法:

ポップオーバーコントローラはdismissPopoverAnimatedへのプログラムの呼び出しに応答して、このメソッドを呼び出すことはありません。プログラムによってポップオーバーを解除する場合は、dismissPopoverAnimated:メソッドを呼び出した直後にクリーンアップアクションを実行する必要があります。

+0

Omg、thx forそれ。 – sabiland

4

2つの方法でポップオーバーを解除できます。 (a)ポップオーバーの外側をタップする。および(b)は

[self.popover dismissPopoverAnimated:YES]; 

と、プログラムでそれをやってあなたがプログラムでそれを行う場合は、ドキュメント(https://developer.apple.com/library/ios/documentation/uikit/reference/UIPopoverControllerDelegate_protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIPopoverControllerDelegate/popoverControllerDidDismissPopoverが:)言う:

はポップオーバーコントローラは プログラムからの呼び出しに応答して、このメソッドを呼び出すことはありません。 dismissPopoverAnimated:メソッドに追加します。 ポップオーバーをプログラムで却下した場合は、dismissPopoverAnimated:メソッドを呼び出した直後に、クリーンアップ アクションを実行する必要があります。

このように、デリゲートを自動的に呼び出すのは正常な動作ではなく、自分で何をやっているのかは問題ありません。

関連する問題