IPhone:在prepareForSegue方法中防止popover segue?

时间:2012-09-15 11:15:23

标签: iphone ios

我的问题类似于Prevent segue in prepareForSegue method?

我正在使用storyboard,我有两个视图控制器。在第一个我有一个按钮。 在故事板中,我有一个带有弹出窗口选项的seque,从按钮到第二个视图控制器。 如果多次单击按钮,弹出窗口将被打开几次。 这就是为什么我想检查prepareForSegue方法是否已经打开popover。如果是,则不要再打开它。那么如何防止prepareForSegue方法中的seque?

2 个答案:

答案 0 :(得分:2)

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

首先,如果你想再次点击按钮来关闭弹出窗口,你可以(a)删除segue; (b)以编程方式呈现弹出窗口或视情况予以驳回:

  1. 从故事板中删除popover segue;
  2. 为您的popover视图提供唯一标识符,以便您可以通过代码实例化控制器;
  3. 确保您对导航栏按钮有一些IBOutlet或其他参考(在我下面的代码示例中,它是myNavBarButton),以便您可以通过该按钮告诉您的popover; < / LI>
  4. 您可能还想将弹出窗口视图的模拟指标更改为“自由形式”,因为如果将其保留为“推断”,Interface Builder将假定您希望它全屏显示并将为您重复调整大小;
  5. 为您的popover定义一个ivar,例如UIPopoverController *_popover;;
  6. 为您的导航栏按钮定义并链接IBAction,根据需要执行解雇或呈现弹出框的工作;和
  7. 确保使用按钮定义视图控制器为UIPopoverControllerDelegate,以便它可以接收和处理popoverControllerDidDismissPopover事件。
  8. 因此,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
    

    其次,你也可以只禁用导航栏按钮,这样你就不会在弹出窗口之上获得弹出窗口。您还将获得一个很好的视觉指示,表明它已被禁用。如此底线,您可以在执行segue之前禁用prepareForSegue中的按钮,然后在解除弹出窗口时重新启用它。您需要在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;
    }
    

答案 1 :(得分:1)

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

无论如何,你可以从UIPopoverControllerDelegate调用这个函数:

  • (无效)dismissPopoverAnimated:动画(BOOL);

也许这个教程会有帮助吗?

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