我有一个设置弹出窗口。我在那个popover中有一个按钮(更多信息)。当用户点击该按钮时,我想调出另一个视图,我想解雇popover。
如何从弹出窗口中实际存在的“更多信息”按钮执行此操作?
当前我有一个处理按钮按下的功能:
- (IBAction)showFullVersionInfo:(id)sender
{
[self dismissPopoverAnimated:YES];
parent.settingsPopover = nil;
//need to show more Info...
}
父级对popover持有一个引用'settingsPopover',我想清除它。
答案 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];
}