我的问题类似于Prevent segue in prepareForSegue method?。
我正在使用storyboard,我有两个视图控制器。在第一个我有一个按钮。 在故事板中,我有一个带有弹出窗口选项的seque,从按钮到第二个视图控制器。 如果多次单击按钮,弹出窗口将被打开几次。 这就是为什么我想检查prepareForSegue方法是否已经打开popover。如果是,则不要再打开它。那么如何防止prepareForSegue方法中的seque?
答案 0 :(得分:2)
正如其他问题的答案所指出的那样,一旦你点击prepareForSegue
,取消它就为时已晚。你需要防止第二次调用segue,而不是试图在segue进程的中途停止它。您可以通过多种方式完成此任务,具体取决于所需的行为:
首先,如果你想再次点击按钮来关闭弹出窗口,你可以(a)删除segue; (b)以编程方式呈现弹出窗口或视情况予以驳回:
IBOutlet
或其他参考(在我下面的代码示例中,它是myNavBarButton
),以便您可以通过该按钮告诉您的popover; < / LI>
UIPopoverController *_popover;
; IBAction
,根据需要执行解雇或呈现弹出框的工作;和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
其次,你也可以只禁用导航栏按钮,这样你就不会在弹出窗口之上获得弹出窗口。您还将获得一个很好的视觉指示,表明它已被禁用。如此底线,您可以在执行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调用这个函数:
也许这个教程会有帮助吗?
http://www.raywenderlich.com/1056/ipad-for-iphone-developers-101-uipopovercontroller-tutorial