Swift:使用prepareForSegue

时间:2016-01-02 04:38:00

标签: ios swift uitableview uiview segue

我在UITableViewController容器中嵌入了UIView,该容器位于UIScrollViewUIViewController的底部。以下是故事板中当前配置的屏幕截图。

screenshot

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

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

什么不工作

  1. UIViewUITableViewController之间的嵌入segue的标识符设置为“embedSegue”
  2. 在嵌入式UITableViewController类的顶部,创建一个变量来保存表的高度:

    var tableHeight: CGFloat!
    
  3. 仍然在嵌入式UITableViewController中,像这样覆盖viewDidLoad,将passHeight打印到控制台进行检查:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.tableView.estimatedRowHeight = 68.0
        self.tableView.rowHeight = UITableViewAutomaticDimension
    
        self.tableHeight = self.tableView.contentSize.height
        print(tableHeight)
    }
    
  4. 在包含UIViewController容器的UIView类中,创建一个变量来保存从UITableViewController传递的值:

    var viewHeight: CGFloat!
    
  5. 仍然在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)
            }
        }
    }
    
  6. 当我运行应用程序时,viewHeight首先打印为Nil,然后打印tableHeight,这意味着在设置tableHeight之前已运行prepareForSegue

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

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

    但是,UIView容器的高度与故事板中设置的高度相同。

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

1 个答案:

答案 0 :(得分:1)

我创建了一个包含三个自定义单元格的UIViewController,而不是使用包含三个UIScrollView的{​​{1}}的{​​{1}}。每个单元格都有自己的自定义UIViews类,以提高灵活性。

这意味着我失去了使用约束来动态改变每个部分的高度的能力。我希望Post Title和Post Text以全屏图像为中心。为实现这一目标,我添加了以下逻辑:

UITableView

参考

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

UITableview with more than One Custom Cells with Swift
有关如何使用3个自定义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 } } 的详细说明