Ios Popover大小不正确-在Popover中的导航控制器下显示UITableView时

Ios Popover大小不正确-在Popover中的导航控制器下显示UITableView时,ios,ipad,uinavigationcontroller,uitableview,uipopovercontroller,Ios,Ipad,Uinavigationcontroller,Uitableview,Uipopovercontroller,我正在编写一个iPad应用程序,其特点是UIPopoverController中的导航控制器下显示UITableView - (void) correctPopoverContentSize { // // removed the following line from the original code in above post as it did not // work for me // CGSize currentSetSizeForPopo

我正在编写一个iPad应用程序,其特点是UIPopoverController中的导航控制器下显示UITableView

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

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

当我取消搜索(或点击导航栏中的后退按钮)时,弹出窗口将返回显示第一个表视图控制器(只有两行的那个)。但是,第一个表视图控制器现在具有更长的大小。换句话说,popover并没有将自身大小调整回两行表,而是保持第二个(搜索结果)表视图控制器的大小(因此它现在有两行“搜索”和“高级设置”以及许多空行)


我的问题是:如何在此实现中使层次结构中的每个tableview控制器(即,在导航控制器下的popover中显示tableview控制器)分别调整大小,并在用户来回导航时恢复到其原始大小。这可能有一个简单的解决办法,但我想不通!如果有人能为我提供解决方案,我将不胜感激。

我通过user@krasnyk从下面的StackOverflow帖子中实现了答案:

这对我来说非常有效,只需要一个改变

基本上添加了与上面文章中详述的相同的功能,只做了一次修改(我在PopupController中的视图继承人中硬编码了每个VC的大小)

我引用此函数是为了在ViewDidLoad和ViewDidAspect函数中为我的PopoverController中显示的VCs链中的每个VC设置正确的popover大小

- (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;
}

我通过user@krasnyk实现了以下StackOverflow帖子中的答案:

这对我来说非常有效,只需要一个改变

基本上添加了与上面文章中详述的相同的功能,只做了一次修改(我在PopupController中的视图继承人中硬编码了每个VC的大小)

我引用此函数是为了在ViewDidLoad和ViewDidAspect函数中为我的PopoverController中显示的VCs链中的每个VC设置正确的popover大小

- (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;
}

由于上述解决方案不再有效,这里有一个更为流行(快速)的替代方案

您可以将popovercontroller传递给DestinationViewController。 然后在viewwillbeen()中调用PreferredContentSizedChangeForChildContentContainer,弹出框将自动调整大小

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 }
}

由于上述解决方案不再有效,这里有一个更为流行(快速)的替代方案

您可以将popovercontroller传递给DestinationViewController。 然后在viewwillbeen()中调用PreferredContentSizedChangeForChildContentContainer,弹出框将自动调整大小

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 }
}