0

我正在编写一个 iPad 应用程序,该应用程序具有在 UIPopoverController 内的导航控制器下显示的 UITableViews。

当我在我的应用程序的主视图控制器中选择一个按钮时,会显示弹出框。弹出窗口打开显示第一个 TableViewController,它有两行 (UITableViewCells) - 第一行是“搜索”,第二行是“高级设置”。在初始显示时,弹出框的大小刚好足以显示两行。

我已经对第一个 TableViewController 的 didSelectRowAtIndexPath 进行了编码,这样当我选择“搜索”时,它会将第二个 TableViewController 推送到 NavigationViewController 上。下一个 View Controller 允许用户执行搜索,然后搜索结果会填充到其 tableview 中。)这个(搜索结果)table view controller 的大小足以容纳搜索返回的所有行。因此,在显示搜索 tableview 控制器时,搜索弹出框会变得更长。

当我取消搜索(或点击导航栏中的后退按钮)时,弹出框返回显示第一个表格视图控制器(只有两行的那个)。然而,这个第一个表视图控制器现在具有更长的尺寸。换句话说,弹出框不会将自身调整回两行表,而是保持第二个(搜索结果)表视图控制器的大小(因此它现在有两行“搜索”和“高级设置”加上一个数字空行)

我的问题是:如何在此实现中获取层次结构中的每个表视图控制器(即表视图控制器显示在导航控制器下的弹出窗口中)单独调整大小并在用户导航返回时返回其原始大小和向前。可能有一个简单的解决方案,但它逃脱了我!感谢有人能指出我的解决方案。

4

2 回答 2

2

由于上述解决方案不再起作用,这里有一个更流行的(Swift)替代方案。

您可以将popovercontroller 传递给您的destinationViewControllers。然后在 viewWillAppear() 中调用 preferredContentSizeDidChangeForChildContentContainer ,弹出框会自动调整大小。

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    if let ppc = popoverController  {
        ppc.preferredContentSizeDidChangeForChildContentContainer(self)
    }
}

如果它不起作用,请确保您正确实施了preferredContentSize。例如,用单个部分计算 tableViewController 的大小,如下所示:

override var preferredContentSize: CGSize {
    get {
        let sectionFrame    = self.tableView.rectForSection(0)
        let titleOnTop      = self.navigationController!.navigationBar.frame.height
        let height          = sectionFrame.height + titleOnTop
        return CGSize(width: super.preferredContentSize.width, height: height)
    }
    set { super.preferredContentSize = newValue }
}
于 2015-10-03T17:56:11.277 回答
1

我从用户@krasnyk 的以下 StackOverflow 帖子中实现了答案:

带有嵌入式导航控制器的弹出框不考虑后导航的大小

一个变化对我来说效果很好......

基本上添加了上述帖子中详述的相同功能,但进行了一次修改(我在 PopupController 的视图层次结构中硬编码了每个 VC 的大小)

我引用此函数在 ViewDidLoad 和 ViewDidAppear 函数中为我的 PopoverController 中显示的 VC 链中的每个 VC 设置正确的弹出框大小。

- (void) correctPopoverContentSize {
    //
    // removed the following line from the original code in above post as it did not
    // work for me 
    //      CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover; 

    CGSize currentSetSizeForPopover = CGSizeMake(320.0f, 180.0f);
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f,    
           currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}
于 2013-01-04T21:24:55.770 回答