objective-c - iOS : how to dismiss popovers

标签 objective-c uipopovercontroller uistoryboard

<分区>

Possible Duplicate:
How to Dismiss a Storyboard Popover

我有一个 iPad Storyboard。按住 Control 键将一个 View 中的条形按钮项目拖动到另一个 View ——并选择弹出窗口样式。当我按下按钮时,新的弹出窗口 View 显示在弹出窗口中,但我有两个问题:

  1. 当我再次按下该按钮时,会显示弹出 View 的另一个实例——我可以看到,黑色边框越来越暗。如果弹出 View 打开并且我按下按钮,弹出 View 应该消失。我该怎么做?
  2. 目前,即使 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;
}

最佳答案

I then do this inside the IBAction:

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

But this gives me this error:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIStoryboardPopoverSegue must be presented from a bar button item or a view.'

Have I created the segue in a bad way or in the call to performSegueWithIdentifier wrong?

当您调用 -performSegueWithIdentifier:sender: 时,您传递的是 self 而不是 sender (点击的按钮),即,您是在需要 UIBarButtonItemUIView 的地方给 segue 一个 UIViewController

这应该有效:

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

关于objective-c - iOS : how to dismiss popovers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8656348/

相关文章:

ios - 使用-(void)tableView :(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 时黑屏

objective-c - 为 HTTP 请求添加错误和成功处理程序

objective-c - subview 呈现延迟

objective-c - 为什么两个不同的实例的指针是相同的?

ios - 弹出演示 Controller (_ :willRepositionPopoverTo:in:) Trying to change the size of popUp on different orientation

ios - 如何在成功登录 UIWebView 后重定向回应用程序

ios - 如何在横向设置垂直约束( Storyboard)

iphone - 从导航项中删除右栏按钮项

显示时 UIPopoverController backgroundColor 导致闪烁

ios - UIPopoverController 放置