在iOS中,如何让popover自行关闭?

时间:2012-03-16 22:40:22

标签: ios

我有一个设置弹出窗口。我在那个popover中有一个按钮(更多信息)。当用户点击该按钮时,我想调出另一个视图,我想解雇popover。

如何从弹出窗口中实际存在的“更多信息”按钮执行此操作?

当前我有一个处理按钮按下的功能:

 - (IBAction)showFullVersionInfo:(id)sender
   {
     [self dismissPopoverAnimated:YES];
     parent.settingsPopover = nil;

     //need to show more Info...

   }

父级对popover持有一个引用'settingsPopover',我想清除它。

3 个答案:

答案 0 :(得分:4)

您不希望在弹出框控制器内执行此操作。弹出控制器应该只管理弹出窗口的内容,而不是显示/隐藏弹出窗口的方式和时间。

您只能在父控制器中执行此类操作。仅从显示它的控制器(并拥有它)隐藏弹出窗口。

你的问题实际应该是:如何告诉父控制器用户在弹出框内执行了一些操作?

答案是:委托。 定义一个委托,在父控制器中实现它,将它传递给你的popover和IBAction调用委托方法。

答案 1 :(得分:0)

最好的方法是在popoverControllerDidDismissPopover:委托回调中释放popover。不幸的是,这个回调不会在dismissPopoverAnimated:之后调用。我通过输入另一个名为popoverDidFinishWorking:的统一回调来解决这个问题。当点击关闭按钮等时,将其从popover发送给所有者。当所有者获得popoverDidFinishWorking:时,它只调用popoverControllerDidDismissPopover:并隐藏/释放popover(settingsPopover)。您还可以在此回调中显示任何其他视图。无论如何,这取决于你的应用程序设计。

答案 2 :(得分:0)

在启动settingsPopover的函数中的“父”对象中,您应该:

- (void) launchDismissSettingPopover {
    if (settingPopover == nil) {
         //Create an launch the popover
    } else {

        [self dismissPopoverAnimated:YES];
        // settingPopover will be nil in navigationController didShowViewController
         //self.settingsPopover = nil;
    }
}

你的父类

之前应该有self.navigationController.delegate = self
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
     if (viewController == self && self.settingPopover != nil) {

        //need to show more Info based on settingPopover info here

          self.settingPopover = nil ;
      }
}

然后在你的popover类方法

 - (IBAction)showFullVersionInfo:(id)sender
   {
     [parent launchDismissSettingPopover];
   }