使用UINavigationController解除UIPopoverController

时间:2014-01-17 15:54:22

标签: ios objective-c uinavigationcontroller uipopovercontroller popover

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

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

  • 创建UIViewController机智xib文件
  • 设置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中正确显示了我的view-和UINavigationController。到目前为止一切都很好!

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

  • 设置按下te按钮的方法。在这个方法中,我想在加载Popover的视图控制器上调用一个函数来再次关闭它..但是我该怎么办?

很快就把事情搞定

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

我一直在搜索SO,但 none 的解决方案和答案解决了我的问题。如果我错过了什么,请通知我;)

提前非常感谢你!

3 个答案:

答案 0 :(得分:2)

你可以通过委托来做到这一点...... 在NewItem.h中声明一个协议

@protocol NewItemDelegate

-(void)onTapDoneButton;
@end

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

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

在doneButtonPuhsed方法的NewItem.m中调用此

[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];
}

现在在此操作方法下面实现NewItemDelegate方法。

-(void)onTapDoneButton{
//dismiss popover here
}

答案 1 :(得分:1)

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

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

然后,在viewDidUnload方法中,删除观察者,如下所示:

[[NSNotificationCenter defaultCenter] removeObserver:self];

当然,你必须创建一个实际上解开popover的函数:

- (void) closePopover
{
    [_popover dismissPopoverAnimated:YES];
}

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

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

答案 2 :(得分:0)

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