Swift:使用 prepareForSegue 将 UIView 容器的高度设置为嵌入式 UITableView 的高度

Posted

技术标签:

【中文标题】Swift:使用 prepareForSegue 将 UIView 容器的高度设置为嵌入式 UITableView 的高度【英文标题】:Swift: Setting height of UIView container to the height of embedded UITableView using prepareForSegue 【发布时间】:2016-01-02 04:38:00 【问题描述】:

我在UIView 容器中嵌入了一个UITableViewController,该容器位于UIViewControllerUIScrollView 的底部。这是情节提要中当前配置的屏幕截图。

UITableView 将包含对所选帖子的回复。因为UITableView 中响应的高​​度和数量是可变的,所以我希望UIView 容器的高度根据表格的高度而变化。当前(不受欢迎的)行为是 UIView 容器保持恒定高度,并在 UITableView 高度大于 UIView 容器高度时滚动。

最可行的方法似乎是让UITableViewController 使用prepareForSegue 将表格的高度传递给UIViewController,然后将UIView 的高度设置为传递的值。但是,在运行 prepareForSegue 之前,我似乎无法设置表格高度的值。

什么不起作用

    UIViewUITableViewController之间的嵌入segue的标识符设置为“embedSegue”

    在嵌入的UITableViewController 类的顶部,创建一个变量来保存表格的高度:

    var tableHeight: CGFloat!
    

    还在嵌入的UITableViewController中,像这样覆盖viewDidLoad,打印passedHeight到控制台检查:

    override func viewDidLoad() 
        super.viewDidLoad()
    
        self.tableView.estimatedRowHeight = 68.0
        self.tableView.rowHeight = UITableViewAutomaticDimension
    
        self.tableHeight = self.tableView.contentSize.height
        print(tableHeight)
    
    

    在包含UIView 容器的UIViewController 类中,创建一个变量来保存从UITableViewController 传递的值:

    var viewHeight: CGFloat!
    

    仍然在UIViewController,像这样覆盖prepareForSegue,将viewHeight设置为传递的tableHeight值,并将viewHeight打印到控制台进行检查:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "embedSegue" 
            let responseTableView = segue.destinationViewController as! ResponseViewController
    
            self.viewHeight = responseTableView.tableHeight
    
            if viewHeight == nil 
                print("Nil")
             else 
                print(viewHeight)
            
        
    
    

    当我运行应用程序时,viewHeight 首先打印为 Nil,然后是 tableHeight,这意味着 prepareForSegue 在设置 tableHeight 之前已经运行。

我也尝试过除了prepareForSegue之外的其他方法,包括在viewDidLayoutSubviews()中调用UIView容器上的各种函数,比如:

.sizeThatFits() .needsUpdateConstraints() .layoutIfNeeded()

但是,UIView 容器的高度与情节提要中设置的高度相同。

作为结语,这是我的第一篇 *** 帖子,我很高兴能加入社区。如果我能澄清我的问题,请告诉我。感谢您抽出宝贵时间。

【问题讨论】:

【参考方案1】:

我没有使用UIViewController 和包含三个UIViewsUIScrollView,而是创建了一个包含三个自定义单元格的UITableView。每个单元格都有自己的自定义UITableViewCell 类以提高灵活性。

这意味着我失去了使用约束来动态更改每个部分的高度的能力。我希望帖子标题和帖子文本以全屏图像为中心。为此,我添加了以下逻辑:

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
        if indexPath.row == 0 
            //Fullscreen image cell - the "20" is for the status bar
            return tableView.frame.size.height - self.navigationController!.navigationBar.frame.size.height - 20
         else 
            //Just use the current rowHeight
            return self.tableView.rowHeight
        
    

参考文献

How to embed a UITableView in a UIScrollview 对引发这个想法的类似问题的简短回答

UITableview with more than One Custom Cells with Swift 详细解释如何使用3个自定义UITableViewCells创建UITableView

【讨论】:

以上是关于Swift:使用 prepareForSegue 将 UIView 容器的高度设置为嵌入式 UITableView 的高度的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 中使用 prepareForSegue 分配对象变为 nil

Swift:prepareForSegue 有两个不同的 segue

如何在 uitableviewcell swift 中使用多个 prepareforsegue 传递数据

Swift:使用 prepareForSegue 将 UIView 容器的高度设置为嵌入式 UITableView 的高度

prepareForSegue 不适用于自定义 segue (swift)

Swift:PrepareForSegue 正在运行但未加载 ViewController