我的问题类似于Prevent segue in prepareForSegue 方法?.
我正在使用故事板,其中有两个视图控制器。在第一个中,我有一个按钮。在 Storyboard 中,我有一个从按钮到第二个视图控制器的带有弹出框选项的序列。如果多次点击按钮,弹出框将被打开多次。所以这就是为什么我要检查prepareForSegue方法是否已经打开了popover。如果是,则不要再次打开它。那么如何防止prepareForSegue方法中的sequ?
我的问题类似于Prevent segue in prepareForSegue 方法?.
我正在使用故事板,其中有两个视图控制器。在第一个中,我有一个按钮。在 Storyboard 中,我有一个从按钮到第二个视图控制器的带有弹出框选项的序列。如果多次点击按钮,弹出框将被打开多次。所以这就是为什么我要检查prepareForSegue方法是否已经打开了popover。如果是,则不要再次打开它。那么如何防止prepareForSegue方法中的sequ?
正如另一个问题的答案所指出的那样,一旦你点击prepareForSegue
,取消它就太晚了。您需要完全防止第二次调用 segue,而不是试图在 segue 过程中途停止它。您可以通过多种方式完成此操作,具体取决于所需的行为:
首先,如果您想再次单击按钮以关闭弹出框,您可以 (a) 删除 segue;(b) 以编程方式呈现弹出框或视情况关闭它:
IBOutlet
导航栏按钮有一些或其他引用(在下面的代码示例中,它是myNavBarButton
),以便您可以告诉您的弹出框从该按钮呈现;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
其次,您也可以禁用导航栏按钮,这样您就不会在弹出框之上获得弹出框。您还将有一个很好的视觉指示它已被禁用。所以最重要的是,您可以在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;
}
我不完全理解这个问题,因为你需要 segue 来实现它。
不管怎样,你可以从 UIPopoverControllerDelegate 调用这个函数:
也许本教程会有所帮助?
http://www.raywenderlich.com/1056/ipad-for-iphone-developers-101-uipopovercontroller-tutorial