为什么 numberOfRowsInSection 只针对一个部分被多次调用?

问题描述 投票:0回答:3
// Variable and ViewDidLoad

var auxRow = 0
var auxSection = 0   

override func viewDidLoad() {
    super.viewDidLoad()
}

//节数,只有一节

 override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        auxSection += 1
        print("times section: ", auxSection)
        return 1
    }

//行数

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    auxRow += 1
    print("times row: ", auxRow)
    return 2
}

// TableView 配置单元格

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let textCellIdentifier = "cellText"
    let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath)
    let variable : String = indexPath.row.description
    cell.textLabel?.text = variable
    return cell

}

输出:

    times section:  1
    times row:  1
    times section:  2
    times row:  2
    times section:  3
    times row:  3
    times section:  4
    times row:  4

方法

numberOfRowsInSection
被调用 4 次。为什么会这样?

ios arrays swift uitableview tableview
3个回答
6
投票

Apple 不保证 UIKit 调用您的委托方法之一的频率。他们拥有框架。我们可以期望他们缓存该值,但没有什么要求他们这样做。


2
投票

您可以在

numberOfRowsInSection
方法中设置断点以查看其内部用途。没有理由不应该多次调用它,因为每当表视图内部需要知道它有多少行时都会调用它。它被调用 4 次,因为 Apple 的 tableview 代码需要在 4 个不同的时间知道一个部分中有多少行。


0
投票

我也想知道这个问题的答案,因为它是一个模糊的问题,没有明确的答案。

我有一个带有选项卡视图控制器的项目,它加载了 3 个选项卡,每个选项卡都包含一个带有表视图的视图控制器。

每次切换选项卡时,numberOfSections 和 numberOfRowsInSection 都会被调用 4 次。

我可以确认 cellForRowAt 只被调用一次。

为了进一步研究这个问题,我设置了一个全新的裸骨项目,其中包含导航控制器和包含表视图的根视图控制器。

numberOfSections 和 numberOfRowsInSection 每次都会被调用两次。

我的猜测是,也许 numberOfSections 和 numberOfRowsInSection 在 viewDidLoad 和 viewDidAppear 中被调用,或者与约束和布局有关。

大多数答案似乎是我们永远不会知道为什么,因为它们是 UIKit / Apple 的委托方法。

我不明白知道这些委托方法何时被调用有什么害处......我们都想学习和理解!

每次执行 tableView.reloadData() 时,它肯定会在 viewDidLoad 中被调用。

© www.soinside.com 2019 - 2024. All rights reserved.