1

我的问题类似于Prevent segue in prepareForSegue 方法?.

我正在使用故事板,其中有两个视图控制器。在第一个中,我有一个按钮。在 Storyboard 中,我有一个从按钮到第二个视图控制器的带有弹出框选项的序列。如果多次点击按钮,弹出框将被打开多次。所以这就是为什么我要检查prepareForSegue方法是否已经打开了popover。如果是,则不要再次打开它。那么如何防止prepareForSegue方法中的sequ?

4

2 回答 2

2

正如另一个问题的答案所指出的那样,一旦你点击prepareForSegue,取消它就太晚了。您需要完全防止第二次调用 segue,而不是试图在 segue 过程中途停止它。您可以通过多种方式完成此操作,具体取决于所需的行为:

首先,如果您想再次单击按钮以关闭弹出框,您可以 (a) 删除 segue;(b) 以编程方式呈现弹出框或视情况关闭它:

  1. 从情节提要中删除弹出框转场;
  2. 为您的弹出视图提供一个唯一标识符,以便您可以通过代码实例化控制器;
  3. 确保您对IBOutlet导航栏按钮有一些或其他引用(在下面的代码示例中,它是myNavBarButton),以便您可以告诉您的弹出框从该按钮呈现;
  4. 您可能还希望将弹出视图的模拟指标更改为“自由形式”,因为如果您将其保留为“推断”,Interface Builder 将假定您希望它是全屏的,并会反复调整它的大小;
  5. 为您的弹出框定义一个 ivar,例如UIPopoverController *_popover;
  6. 为您的导航栏按钮定义和链接IBAction,该按钮执行适当的解除或呈现弹出框的工作;和
  7. 确保将带有按钮的视图控制器定义为 a UIPopoverControllerDelegate,以便它可以接收和处理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执行 segue 之前禁用该按钮,然后在弹出窗口被解除时重新启用它。您需要在 Interface Builder 中为您的 segue 定义一个标识符,并且您需要一个对导航栏按钮的出口/引用,以便您可以启用和禁用它。然后它看起来像:

- (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

我不完全理解这个问题,因为你需要 segue 来实现它。

不管怎样,你可以从 UIPopoverControllerDelegate 调用这个函数:

  • (void)dismissPopoverAnimated:(BOOL)动画;

也许本教程会有所帮助?

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

于 2012-09-15T11:39:04.357 回答