0

我正在編寫一個iPad應用程序,它具有在UIPopoverController內的導航控制器下顯示的UITableViews功能。彈出窗口大小不正確 - 在彈出窗口導航控制器中顯示UITableViews時

當我在我的應用程序的主視圖控制器中選擇一個按鈕時,會顯示彈出窗口。彈出窗口打開顯示第一個TableViewController,它有兩行(UITableViewCells) - 第一行是「搜索」,第二行是「高級設置」。在初始顯示時,彈出窗口的大小足以顯示兩行。

我編寫了第一個TableViewController的didSelectRowAtIndexPath,當我選擇「Search」時,它將第二個TableViewController推到NavigationViewController上。這個下一個視圖控制器允許用戶執行搜索,然後將搜索結果填充到其表格視圖中。)這個(搜索結果)表格視圖控制器的大小足以容納搜索返回的所有行。顯示搜索表視圖控制器時,搜索彈出窗口因此變得更長。

當我取消搜索(或點擊導航欄中的後退按鈕)時,彈出窗口返回到顯示第一個表格視圖控制器(僅有兩行)。但是,這個第一個表視圖控制器現在具有更長的大小。換句話說,彈出窗口不是將其自身重新調整回到兩行表格,而是保持第二個(搜索結果)表格視圖控制器的大小(所以它現在具有兩行「搜索」和「高級設置」以及一個數字的空行)

我的問題是:我怎樣才能得到在這個實現中的層次結構中的每個表視圖控制器(即在一個導航控制器下的彈出窗口中顯示錶視圖控制器)單獨調整大小並返回到它的當用戶前後導航時的原始大小。這可能有一個簡單的解決方案,但它逃脫了我!感謝有人能指點我一個解決方案。

回答

1

我實現從下面的StackOverflow職位的答案被用戶@krasnyk:

Popover with embedded navigation controller doesn't respect size on back nav

這對我來說有一個變化偉大的工作......

基本上都添加了在詳細的功能相同上面的帖子有一個修改(我硬編碼的每個VC的大小在我看來在PopupController heirarchy)

我引用此函數來設置ViewDidLoad中正確的彈出窗口大小以及在我的PopoverController中顯示的VC鏈中的每個VC的ViewDidAppear函數。

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

由於上述解決方案不再有效,下面是一個更新的(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 } 
}