使用 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