TableView仅加载可见单元格(12个部分表格视图中的前4个部分)

时间:2016-09-11 01:29:37

标签: swift uitableview swift2 autolayout

我试图找出为什么我的tableView只渲染调用viewDidAppear方法时用户可见的部分。

首次启动应用程序时,第1,2和3部分正确呈现,如下所示。但是,第4节及以后的部分无法正确呈现。当我按下刷新按钮(手动调用reload()方法)时,单击刷新按钮时可见部分会刷新并正确呈现。

我已将viewDidAppear方法以及临时“刷新”按钮链接到下面的reload()方法:

    textViewArray = [m1DF,m2DF,m3DF,m4DF,m5DF,m6DF,m7DF,m8DF,m9DF,m10DF,m11DF,m12DF,m13DF,m14DF,m15DF,m16DF]

    for (index, tv) in textViewArray!.enumerate() {
        let fixedWidth = tv.frame.size.width
        tv.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
        let newSize = tv.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
        var newFrame = tv.frame
        newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
        tv.frame = newFrame;
        heightArray[index] = newSize.height
    }

    for (index, _) in (heightArray.enumerate()) {
        heightArray[index] = textViewArray![index].frame.height

    }
    self.tableView.reloadData()

当我第一次启动应用程序时,第1,2和3部分正确呈现如下所示:

enter image description here

但是,第4节及以后的部分无法正确呈现: enter image description here

当我按下刷新按钮(手动调用reload()方法)时,单击刷新按钮(在本例中为标题为“M05”和“M06”的部分)中的可见部分会刷新并正确渲染:

enter image description here

修改

不包括网点的完整代码:

导入UIKit 导入AdSupport 导入iAd

class CalculatorTableViewController: UITableViewController {

    var heightArray: [CGFloat] = [44.0,44.0,44.0,44.0,44.0,44.0,44.0,44.0,44.0,44.0,44.0,44.0,44.0,44.0,44.0,44.0]

    var textViewArray = [UITextView]?()

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        reload()
    }



    func reload() {

        textViewArray = [m1DF,m2DF,m3DF,m4DF,m5DF,m6DF,m7DF,m8DF,m9DF,m10DF,m11DF,m12DF,m13DF,m14DF,m15DF,m16DF]
        print("*****1*****\n\n\n\n\n \(m1DF.bounds.height), \(m1DF.frame.height)")

        for (index, tv) in textViewArray!.enumerate() {
            let fixedWidth = tv.frame.size.width
            tv.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
            let newSize = tv.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
            var newFrame = tv.frame
            newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
            tv.frame = newFrame;
            heightArray[index] = newSize.height
            print("Row \(index) has height \(newSize.height)")
        }

        for (index, _) in (heightArray.enumerate()) {
            heightArray[index] = textViewArray![index].frame.height

        }
        self.tableView.reloadData()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

    }

    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

        //sizeCell(indexPath.section)
    }

    @IBAction func refreshButton(sender: AnyObject) {

        reload()



    }

    override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 300.0
    }

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if indexPath.row == 0 {
            return heightArray[indexPath.section]
        } else {
            return UITableViewAutomaticDimension
        }
    }

    /*override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 200.0
    }*/



}

1 个答案:

答案 0 :(得分:2)

查看您的代码,我认为您对在UIKit中实现表视图的关键原则感到困惑。它可能是令人生畏的,我当然发现它一开始很混乱!您应该查看以下参考: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/index.html#//apple_ref/occ/cl/UITableView 这更详细地概述了我将要谈论的一些事情。 从本质上讲,UiTableViewController需要做两件事:首先,它需要知道从哪里获取数据来填充表格;第二,它需要知道如何以您想要的方式将表格放在一起并将其呈现给用户。 对于第一个任务 - 将其称为数据任务,实际上非常简单。您只需要确保表视图控制器可以访问数据对象,该数据对象封装了您需要的所有数据。有一个专门的协议 - UITableViewDataSource - 但你不需要这么复杂。我已经实现了从字符串数组到使用更高维度的专用数据管理器类的表格。

这些任务中的第二个 - 称之为演示任务 - 可能更令人困惑。配置表视图的方式是通过委托方法准备好与UITableViewController对象一起打包(因为它默认是表视图的委托)。

也许最重要的是:cellForRowAtIndexPath:。此函数告诉视图在表中的每个索引路径放置什么。您可以使用委托函数中提供的索引路径来查找所需的数据(例如,在简单的情况下,使用cell.text = stringData [indexPath.row]),然后定制视图和任何子视图以向您显示该数据我想要。我假设你知道怎么做。实现cellForRowAtIndexPath可能有问题的一点是,您需要重新使用出列的单元格,而不是每次需要时都创建新单元格。这样做的方法是:首先,通过调用registerClass:forCellReuseIdentifier告诉表视图控制器您可重用单元使用哪个类。在标准情况下,您将注册的类将是UiTableViewCell,但您也可以使用自己的类。然后,您可以通过调用dequeueReusableCellWithIdentifier来获取其中一个单元格(这将是一个不再使用的单元格,即它已从屏幕滚动)。

你需要的另一个关键函数是:numberOfRowsInSection(_ section:Int),它告诉控制器表中每个部分有多少行(如果只有一个部分,它当然是表中的行数) )。在初始化表以设置这些基本参数时,可以使用UITableView变量numberOfSections和UITableView rowHeight。

把这一切放在一起,就没有必要为表中的每一行设置高度(就像你曾经尝试过的那些数组一样),也没有显式的reload()函数 - 有一个函数“内置”来执行此操作,只需调用我已经提到过的方法。

为了不把这篇文章写成我写的最长的帖子,我会留在那里!但是,如果您希望我发送一些示例代码,我很乐意这样做,虽然您可能更好地使用我上面简要概述的内容 - 希望有所帮助!