// 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 次。为什么会这样?
Apple 不保证 UIKit 调用您的委托方法之一的频率。他们拥有框架。我们可以期望他们缓存该值,但没有什么要求他们这样做。
您可以在
numberOfRowsInSection
方法中设置断点以查看其内部用途。没有理由不应该多次调用它,因为每当表视图内部需要知道它有多少行时都会调用它。它被调用 4 次,因为 Apple 的 tableview 代码需要在 4 个不同的时间知道一个部分中有多少行。
我也想知道这个问题的答案,因为它是一个模糊的问题,没有明确的答案。
我有一个带有选项卡视图控制器的项目,它加载了 3 个选项卡,每个选项卡都包含一个带有表视图的视图控制器。
每次切换选项卡时,numberOfSections 和 numberOfRowsInSection 都会被调用 4 次。
我可以确认 cellForRowAt 只被调用一次。
为了进一步研究这个问题,我设置了一个全新的裸骨项目,其中包含导航控制器和包含表视图的根视图控制器。
numberOfSections 和 numberOfRowsInSection 每次都会被调用两次。
我的猜测是,也许 numberOfSections 和 numberOfRowsInSection 在 viewDidLoad 和 viewDidAppear 中被调用,或者与约束和布局有关。
大多数答案似乎是我们永远不会知道为什么,因为它们是 UIKit / Apple 的委托方法。
我不明白知道这些委托方法何时被调用有什么害处......我们都想学习和理解!
每次执行 tableView.reloadData() 时,它肯定会在 viewDidLoad 中被调用。