0

我正在尝试使用 Segue 呈现然后关闭 Popover 视图 aUIBarButtonItem被单击。

我创建了一个通用的 Segue,它除了视图之外不锚定任何东西,并为其命名

我已将 Interface Builder 中的 UIBarButtonItem 锚定为:

- (IBAction)clickedSettings:(id)sender {

    if(self.popSegue != nil) {
        [self.popSegue.popoverController dismissPopoverAnimated:YES];
    } else {
        //Current says only a button may
        [self performSegueWithIdentifier:@"Settings" sender:sender];
    }
}

但是,当我单击按钮显示 Segue 时,它​​会给我一个错误:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UIStoryboardPopoverSegue 必须从条形按钮项或视图呈现。”

它甚至没有击中我的-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

我在堆栈上阅读了以下问题:

  1. iOS:如何关闭 Popover
  2. UIBarButtonItem + popover segue 创建多个弹出框

但我仍然得到同样的错误。对于我的生活,我无法弄清楚出了什么问题

4

2 回答 2

3

我不相信这一点,因为我通过多个 StackOverflow 线程得到了它的每一点,但我得到了这个:

@interface MyViewController ()
- (IBAction) toggleSettingsInPopover: (id) sender;
@property (nonatomic, strong) UIStoryboardPopoverSegue *settingsPopoverSegue;
@end

@implementation MyViewController
@synthesize settingsPopoverSegue = _settingsPopoverSegue;

- (IBAction) toggleSettingsInPopover: (id) sender {
    if( [self.settingsPopoverSegue.popoverController isPopoverVisible] ) {
        [self.settingsPopoverSegue.popoverController dismissPopoverAnimated: YES];
        self.settingsPopoverSegue = nil;
    } else {
        [self performSegueWithIdentifier: @"Settings" sender: sender];
    }
}

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender {
    if( [segue.identifier isEqualToString: @"Settings"] ) {
        if( [segue isKindOfClass: [UIStoryboardPopoverSegue class]] )
            self.settingsPopoverSegue = (UIStoryboardPopoverSegue *) segue;
        MySettingsViewController *msvc = segue.destinationViewController;
        msvc.delegate = self;
    }
}
@end

在我的情节提要中,我从我的设置栏按钮项目中控制拖动MyViewController并将其连接到toggleSettingsInPopover动作。然后我从控件拖动MyViewController到设置视图以创建 segue,将其类型设置为popover,将其标识符设置为Settings,将其方向设置为向上和向左(工具栏位于屏幕底部,按钮位于右端),然后从它拖到Anchor我连接到动作的栏按钮项目。

于 2012-02-15T04:26:35.217 回答
2

您必须通过 Ctrl 将锚字段从 segue 属性检查器拖动到 UIBarButton 来将 segue 锚定到 UIBarButton。

如果您以相反的方式执行此操作,Ctrl-Dragging 从按钮到要显示的窗口,您将无法从 Popoverwindow 控制行为。

(重要的部分也在 LavaSlider 的回复最后一句)

于 2012-07-06T09:12:45.450 回答