Segue Popover不会表现得很好

时间:2012-01-13 02:46:25

标签: ios uistoryboard segue

我正在尝试使用Segue呈现然后关闭点击UIBarButtonItem的Popover视图。

我创建了一个通用的Segue,除了视图之外没有任何东西,并且给它起了一个名字

我已将接口构建器中的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:How to dismiss Popover
  2. UIBarButtonItem + popover segue creates multiple popovers
  3. 但我仍然得到同样的错误。对于我的生活,我无法弄清楚出了什么问题

2 个答案:

答案 0 :(得分: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拖动到我连接到操作的栏按钮项。

答案 1 :(得分:2)

你必须通过Ctrl-Dragging字段从segue属性检查器到UIBarButton来将segue锚定到UIBarButton。

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

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