1

私の質問は、prepareForSegue メソッドでセグエを防止しますか? .

2 つのビュー コントローラーがあるストーリーボードを使用しています。最初のものにはボタンがあります。ストーリーボードには、ボタンから2番目のビューコントローラーへのポップオーバーオプションを備えたシークがあります。ボタンを数回クリックすると、ポップオーバーが数回開きます。そのため、ポップオーバーが既に開いているかどうかを prepareForSegue メソッドで確認したいのです。開いている場合は、再度開かないでください。では、prepareForSegue メソッドでシークを防ぐ方法は?

4

2 に答える 2

2

他の質問への回答が指摘しているように、一度ヒットprepareForSegueすると、キャンセルするには遅すぎます。セグエプロセスの途中で停止しようとするのではなく、セグエが2回目に呼び出されないようにする必要があります。これは、目的の動作に応じて、さまざまな方法で実行できます。

まず、ボタンを2回クリックしてポップオーバーを閉じる場合は、(a)セグエを削除します。(b)プログラムでポップオーバーを提示するか、必要に応じて却下します。

  1. ストーリーボードからポップオーバーセグエを削除します。
  2. ポップオーバービューに一意の識別子を指定して、コードを介してコントローラーをインスタンス化できるようにします。
  3. IBOutletナビゲーションバーボタンへの参照があることを確認してください(以下の私のコードサンプルでは、​​それmyNavBarButtonです)。これにより、ポップオーバーがそのボタンから表示されるように指示できます。
  4. ポップオーバービューのシミュレートされたメトリックを「フリーフォーム」に変更することもできます。これは、「推測」のままにすると、Interface Builderがフルスクリーンであると想定し、繰り返しサイズを変更するためです。
  5. ポップオーバーのivarを定義します。例:UIPopoverController *_popover;;
  6. 必要に応じてポップオーバーを閉じたり表示したりする作業を行うナビゲーションバーボタンを定義してリンクIBActionします。と
  7. イベント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;
}
于 2012-09-15T13:50:31.550 に答える
1

それを実現するにはセグエが必要になるため、質問を正確に理解できません。

とにかく、この関数を UIPopoverControllerDelegate から呼び出すことができます:

  • (void)dismissPopoverAnimated:(BOOL)アニメーション;

多分このチュートリアルが役立つでしょうか?

http://www.raywenderlich.com/1056/ipad-for-iphone-developers-101-uipopovercontroller-tutorial

于 2012-09-15T11:39:04.357 に答える