他の質問への回答が指摘しているように、一度ヒットprepareForSegue
すると、キャンセルするには遅すぎます。セグエプロセスの途中で停止しようとするのではなく、セグエが2回目に呼び出されないようにする必要があります。これは、目的の動作に応じて、さまざまな方法で実行できます。
まず、ボタンを2回クリックしてポップオーバーを閉じる場合は、(a)セグエを削除します。(b)プログラムでポップオーバーを提示するか、必要に応じて却下します。
- ストーリーボードからポップオーバーセグエを削除します。
- ポップオーバービューに一意の識別子を指定して、コードを介してコントローラーをインスタンス化できるようにします。
IBOutlet
ナビゲーションバーボタンへの参照があることを確認してください(以下の私のコードサンプルでは、それmyNavBarButton
です)。これにより、ポップオーバーがそのボタンから表示されるように指示できます。
- ポップオーバービューのシミュレートされたメトリックを「フリーフォーム」に変更することもできます。これは、「推測」のままにすると、Interface Builderがフルスクリーンであると想定し、繰り返しサイズを変更するためです。
- ポップオーバーのivarを定義します。例:
UIPopoverController *_popover;
;
- 必要に応じてポップオーバーを閉じたり表示したりする作業を行うナビゲーションバーボタンを定義してリンク
IBAction
します。と
- イベント
UIPopoverControllerDelegate
を受信して処理できるように、ボタンを使用してViewControllerを必ず定義してください。popoverControllerDidDismissPopover
したがって、ARCソリューションは次のようになります。
@interface MyViewController ()
{
UIPopoverController *_popover;
}
@end
@implementation MyViewController
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
_popover = nil;
}
- (IBAction)navbarButtonClicked:(id)sender
{
if (_popover)
{
// If the popover already is present, dismiss it
// I'm dismissing the popover here, but if you wanted to do something else,
// e.g. like do nothing, you could replace these two lines with whatever
// behavior you want if the user clicked on the button again.
[_popover dismissPopoverAnimated:YES];
_popover = nil;
}
else
{
// If the popover doesn't exist yet, let's create and present it
UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"gesturePopover"];
_popover = [[UIPopoverController alloc] initWithContentViewController:controller];
[_popover presentPopoverFromBarButtonItem:self.myNavBarButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
}
// the rest of your main view controller's implementation
@end
次に、代わりにナビゲーションバーボタンを無効にして、ポップオーバーの上にポップオーバーが表示されないようにすることもできます。また、無効になっていることを視覚的に示すことができます。つまり、セグエを実行する前にボタンを無効にしprepareForSegue
て、ポップオーバーが閉じられたときに再度有効にすることができます。Interface Builderでセグエの識別子を定義する必要があります。また、有効または無効にできるように、ナビゲーションバーボタンへのアウトレット/参照が必要です。その場合、次のようになります。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"mySegueIdentifier"])
{
UIPopoverController *popover = [(UIStoryboardPopoverSegue *)segue popoverController];
popover.delegate = self;
self.myNavBarButton.enabled = FALSE;
}
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
self.myNavBarButton.enabled = TRUE;
}