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
,该容器位于UIViewController
中UIScrollView
的底部。这是情节提要中当前配置的屏幕截图。
UITableView
将包含对所选帖子的回复。因为UITableView
中响应的高度和数量是可变的,所以我希望UIView
容器的高度根据表格的高度而变化。当前(不受欢迎的)行为是 UIView
容器保持恒定高度,并在 UITableView
高度大于 UIView
容器高度时滚动。
最可行的方法似乎是让UITableViewController
使用prepareForSegue
将表格的高度传递给UIViewController
,然后将UIView
的高度设置为传递的值。但是,在运行 prepareForSegue 之前,我似乎无法设置表格高度的值。
什么不起作用
-
将
UIView
和UITableViewController
之间的嵌入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
容器上的各种函数,比如:
但是,UIView
容器的高度与情节提要中设置的高度相同。
作为结语,这是我的第一篇 *** 帖子,我很高兴能加入社区。如果我能澄清我的问题,请告诉我。感谢您抽出宝贵时间。
【问题讨论】:
【参考方案1】:我没有使用UIViewController
和包含三个UIViews
的UIScrollView
,而是创建了一个包含三个自定义单元格的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 的高度