使用 UINavigationController 关闭 UIPopoverController

Posted

技术标签:

【中文标题】使用 UINavigationController 关闭 UIPopoverController【英文标题】:Dismissing UIPopoverController with UINavigationController 【发布时间】:2014-01-17 15:54:21 【问题描述】:

我目前正在构建一个 iPad 应用程序,我需要在其中实现弹出视图。

我已经像往常一样设置了一个视图控制器:

使用 xib 文件创建 UIViewController 设置 xib 并在其 .h 和 .m 文件中进行必要的编程

现在在我从(从 UIBarButtonItem)加载它的视图控制器中,我有这个代码:

- (void) action

    ItemContent *newItem = [[ItemContent alloc] initWithNibName:@"ItemContent" bundle:nil];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:newItem];
    _popover = [[UIPopoverController alloc] initWithContentViewController:nav];
    [_popover setPopoverContentSize:CGSizeMake(557, 700) animated:YES];
    _popover.delegate = self;
    [_popover presentPopoverFromBarButtonItem:self.navigationItem.rightBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

这会在 UIPopOverController 中正确显示我的视图和 UINavigationController。到目前为止一切顺利!

在 newItem 视图控制器中,我在导航栏中创建了一个条形按钮,上面写着“完成”。当按下该按钮时,我希望 UIPopOverController 消失。我该怎么做:

设置按下按钮时的方法。在这种方法中,我想在加载 Popover 的视图控制器上调用一个函数以再次将其关闭。但我该怎么做呢?

简单地说

如何让我的 UIPopOverController 调用加载 UIPopOverController 的视图控制器上的方法?

我已经搜索了一段时间,但没有解决方案和答案解决了我的问题。如果我错过了什么,请告诉我;)

非常感谢您!

【问题讨论】:

【参考方案1】:

您可以通过委托来执行此操作... 在 NewItem.h 中声明一个协议

@protocol NewItemDelegate

-(void)onTapDoneButton;
@end

现在像这样创建一个委托属性

@property (nonatomic, assign) id<NewItemDelegate>delegate;

在 NewItem.m 中的 doneButtonPuhsed 方法中调用这个

[self.delegate onTapDoneButton];

稍微改变一下这个方法

- (void) action

    ItemContent *newItem = [[ItemContent alloc] initWithNibName:@"ItemContent" bundle:nil];
    newItem.delegate =self;
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:newItem];
    _popover = [[UIPopoverController alloc] initWithContentViewController:nav];
    [_popover setPopoverContentSize:CGSizeMake(557, 700) animated:YES];
    _popover.delegate = self;
    [_popover presentPopoverFromBarButtonItem:self.navigationItem.rightBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

现在在这个action方法下面实现NewItemDelegate方法。

-(void)onTapDoneButton
//dismiss popover here

【讨论】:

成功了!非常感谢!【参考方案2】:

我也遇到了这个问题,并使用通知解决了它。 在您的父控制器中,在 viewDidLoad 方法中,您必须添加一个观察者:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(closePopover)
                                                 name:@"closePopoverName"
                                               object:nil];

然后,在您的 viewDidUnload 方法中,您可以像这样删除观察者:

[[NSNotificationCenter defaultCenter] removeObserver:self];

当然,您必须创建实际关闭弹出框的函数:

- (void) closePopover

    [_popover dismissPopoverAnimated:YES];

然后,在您的 ItemContent 控制器中,您只需在要关闭弹出框时发布通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"closePopoverName" object:self userInfo:nil];

【讨论】:

【参考方案3】:

您可以在 ItemContent 上定义协议并在 CallerViewController 上使用它。如果您想关闭 Popover,只需调用您的委托方法,您将在 CallerViewController 上实现该方法

【讨论】:

您好,感谢您的反应!您能否更深入地解释/演示您的意思?我应该在 ItemContent 上定义什么样的协议以及如何在 CallerViewController 上使用它。你可能有一些示例代码吗? 这描述了委托模式 - 我稍后会发布一些代码。 那太好了,期待

以上是关于使用 UINavigationController 关闭 UIPopoverController的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationcontroller 中未使用的视图会发生啥?

使用 push segue 时 UINavigationController 是不是强制

UINavigationController - 使用 UIBlurEffect 清除背景

一起使用 UITabBarController 和 UINavigationController

iPhone - UINavigationController - 使用 CATransaction 自定义动画

如何在 SwiftUI 中使用 UINavigationController