我有一个UISplitViewController,其主视图设置如下:
UITabBarController
Tab1:
UINavigationController -> UIViewController -> UIViewController
Tab2:
UINavigationController -> UIViewController
每个UIViewControllers都是一个表视图,当用户选择最后一行时,一个图像显示在详细视图中,其中包含一个UIScrollView。
标签栏Controller是UISplitViewControllerDelegate,用于处理滚动视图顶部工具栏上的按钮。
问题是,我想添加代码以在用户做出选择时解除popover。当按钮上升时,指向弹出窗口的指针必须保存在标签栏控制器中,然后用于在用户进行最终选择时将弹出窗口中的几个视图控制器关闭。似乎没有任何方法可以让视图控制器需要指针来获取它,而不需要做一些事情,比如将它存储在App Delegate中。
我没有看到其他人提出这个问题,这让我相信我再次忽略了一些简单的事情。请赐教!
答案 0 :(得分:0)
您可以创建一个单例类来跟踪您的弹出状态,然后平等且轻松地将其提供给所有类。这样,它可以很容易地从任何代码更新和访问,而不必直接使应用程序委托负担过重,即使这基本上是相同的想法,但在它自己的单身中更清洁。
答案 1 :(得分:0)
听起来你的标签栏控制器已经是UITabBarController
的子类,这意味着你已经有了一些自定义代码。我建议标签栏控制器是弹出框的主要所有者,表视图控制器有责任简单地通知标签栏控制器已做出选择。标签栏控制器可以通过关闭弹出窗口来响应该消息。您可以利用UIViewController
已经有一种方法来访问包含给定控制器的标签栏控制器这一事实。
所以它看起来像这样:
@interface MyTabBarController : UITabBarController
- (void)itemWasSelected;
@end
@implementation MyTabBarController {
UIPopoverController *popover;
}
- (void)itemWasSelected {
[popover dismissPopoverControllerAnimated:YES];
}
@end
//////////////
@implementation TableController
- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)path {
// Do whatever else you want to do
MyTabBarController *tabController = (MyTabBarController *)self.tabBarController;
[tabController itemWasSelected];
}
使用此解决方案,表控制器不必知道有关弹出窗口的任何信息;它必须知道它将被呈现在MyTabBarController
内,这对它来说似乎是合理的。