关闭拆分视图弹出框控制器

Posted

技术标签:

【中文标题】关闭拆分视图弹出框控制器【英文标题】:Dismissing the split view popover controller 【发布时间】:2012-06-13 00:44:04 【问题描述】:

我有一个 UISplitViewController,主视图设置如下:

UITabBarController
  Tab1:
    UINavigationController -> UIViewController -> UIViewController
  Tab2:
    UINavigationController -> UIViewController

每个 UIViewController 都是一个表格视图,当用户在最后一个中选择一行时,详细视图中会显示一个图像,其中包含一个 UIScrollView。

标签栏控制器是 UISplitViewControllerDelegate,负责将按钮放在滚动视图顶部的工具栏上。

问题是,我想添加代码以在用户做出选择时关闭弹出框。当按钮上升时,指向弹出框的指针必须保存在标签栏控制器中,然后在用户做出最终选择时用于关闭弹出框几个视图控制器。视图控制器似乎没有任何方法需要该指针来获取它,而无需执行诸如将其存储在 App Delegate 中之类的粗暴操作。

我没有看到其他人问这个问题,这让我相信我再次忽略了一些简单的事情。请赐教!

【问题讨论】:

【参考方案1】:

听起来您的标签栏控制器已经是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 中呈现,这对它来说似乎是合理的。

【讨论】:

【参考方案2】:

您可以创建一个单例类来跟踪您的弹出框状态,然后将其平等且轻松地提供给所有类。这样就可以轻松地从任何代码更新和访问它,而不必直接让应用程序代理负担过重,尽管这基本上是相同的想法,但在它自己的单例中更简洁。

【讨论】:

以上是关于关闭拆分视图弹出框控制器的主要内容,如果未能解决你的问题,请参考以下文章

未调用拆分视图弹出框委托方法

在 iPhone 6 Plus 上关闭 UISplitViewController 弹出框时 UIWebView 被拉伸

在弹出窗口中显示 UISplitViewController

iOS 弹出框在关闭后不会消失

在后台点击 Swift 时禁用关闭弹出框

在表格视图中选择项目后无法关闭弹出框