我正在尝试使用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
我在堆栈上阅读了以下问题:
但我仍然得到同样的错误。对于我的生活,我无法弄清楚出了什么问题
答案 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的回复的最后一句中)