3

可能重复:
如何关闭情节提要弹出框

我有一个 iPad 故事板。一个视图中的条形按钮项被 Control 拖动到另一个视图 - 并且选择了弹出框样式。当我按下按钮时,新的弹出窗口视图会显示在弹出窗口中,但我有两个问题:

  1. 当我再次按下按钮时,会显示另一个弹出视图实例——我可以看到,黑色边框越来越暗。如果弹出视图打开并且我按下按钮,弹出视图应该关闭。我怎样才能做到这一点?
  2. 目前,即使视图中的内容没有那么高,新的弹出视图也会浮动到屏幕的按钮上。如何控制弹出视图的尺寸?

编辑1:

我通过从控制器底部的黄色控制器图标拖动到另一个视图来创建一个 segue,该视图应该在弹出框内。此弹出框的标识符是 settingsPopover。

然后我在 IBAction 中执行此操作:

- (IBAction)settingsButtonTapped:(id)sender {
        [self performSegueWithIdentifier:@"settingsPopover" sender:self];
}

但这给了我这个错误:

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

我是否以不好的方式或在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。例如,在我的故事板中,具有类 SettingsViewController 的视图被设计为分组表视图。有没有办法显示在弹出框内的故事板中设计的 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;
}
4

4 回答 4

2

然后我在 IBAction 中执行此操作:

- (IBAction)settingsButtonTapped:(id)sender {
        [self performSegueWithIdentifier:@"settingsPopover" sender:self];
}

但这给了我这个错误:

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

我是否以错误的方式创建了 segue,或者在调用 performSegueWithIdentifier 时出错了?

当您调用ie 时,您正在传递self而不是(点击的按钮) ,您正在给 segue a它期望 a or的地方。sender-performSegueWithIdentifier:sender:UIViewControllerUIBarButtonItemUIView

这应该有效:

 - (IBAction)settingsButtonTapped:(id)sender {
         [self performSegueWithIdentifier:@"settingsPopover" sender:sender];
 }
于 2011-12-28T16:33:07.263 回答
1

故事板旨在成为通用的应用程序流程和界面工具。它们从您的代码中抽象出许多常见的样板文件,因此您可以轻松地从高层次上看到正在发生的事情。

不幸的是,您将无法纯粹在 Storyboards 中捕获您想要的逻辑。就像 Storyboards 很乐意以模态方式将视图控制器呈现为 segue 但不知道以模态方式关闭视图控制器一样,Storyboards 将呈现弹出框控制器,但它不提供您关闭它们的能力。

  1. 而不是为此使用segue,只需IBAction为栏按钮创建一个自定义。跟踪是否显示了弹出框,如果是,则在此方法中将其关闭。

  2. UIPopoverController有一个名为的属性popoverContentSize,可以让您控制它。

于 2011-12-28T13:28:07.207 回答
1

每次执行 Segue 时,它​​都会创建一个新的 viewController,正如您在连接按钮以执行 segue 时所看到的那样。因此,您需要通过从底部的 viewController 图标拖动到目的地来为 viewController 创建一个“通用”segue。然后,正如 LucasTizma 建议的那样,将按钮连接到一个IBAction调用performSegueWithIdentifier:或关闭弹出框的按钮,条件是弹出框是否在屏幕上。

于 2011-12-28T13:44:00.160 回答
0

这里有一个不同的解决方案。segue 将按钮操作更改为显示或关闭弹出窗口。

于 2012-01-15T06:17:13.100 回答