<分区>
Possible Duplicate:
How to Dismiss a Storyboard Popover
我有一个 iPad Storyboard。按住 Control 键将一个 View 中的条形按钮项目拖动到另一个 View ——并选择弹出窗口样式。当我按下按钮时,新的弹出窗口 View 显示在弹出窗口中,但我有两个问题:
- 当我再次按下该按钮时,会显示弹出 View 的另一个实例——我可以看到,黑色边框越来越暗。如果弹出 View 打开并且我按下按钮,弹出 View 应该消失。我该怎么做?
- 目前,即使 View 中的内容不是那么高,新的弹出 View 也会 float 到屏幕的按钮上。如何控制弹出 View 的尺寸?
编辑 1:
我通过从 Controller 底部的黄色 Controller 图标拖动到另一个 View 创建了一个 segue,该 View 应该在弹出框内。此弹出窗口的标识符是 settingsPopover。
然后我在 IBAction 中执行此操作:
- (IBAction)settingsButtonTapped:(id)sender {
[self performSegueWithIdentifier:@"settingsPopover" sender:self];
}
但这给了我这个错误:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIStoryboardPopoverSegue must be presented from a bar button item or a view.'
我是否以错误的方式创建了 segue 或在调用 performSegueWithIdentifier
时出错?
编辑 2:
我已经创建了这个 IBAction:
- (IBAction)settingsButtonTapped:(id)sender {
if (_settingsPopover == nil) {
SettingsViewController* settingsView = [[SettingsViewController alloc] initWithStyle:UITableViewStylePlain];
self.settingsPopover = [[UIPopoverController alloc] initWithContentViewController:settingsView];
}
[self.settingsPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
它几乎可以工作,但一个缺点是它没有使用我的 Storyboard 中设计的 UIView。例如,在我的 Storyboard中,具有 SettingsViewController 类的 View 设计为分组 TableView 。有没有办法在弹出框内显示 Storyboard中设计的 UIView 而不是原始的 SettingsViewController 实例?
解决方案:
我在 Storyboard 中使用标识符“settingsPopover”创建了一个全局 segue。
- (IBAction)settingsButtonTapped:(id)sender {
if (self.settingsPopover==nil) {
[self performSegueWithIdentifier:@"settingsPopover" sender:sender];
}
}
#pragma mark - UIView
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"settingsPopover"]) {
self.settingsPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
self.settingsPopover.delegate = self;
}
}
#pragma mark - UIPopoverControllerDelegate
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
self.settingsPopover = nil;
}