有人能解释一下为什么UITableView在设置时会多次调用其委托和数据源吗?看着我现在正在处理的一个表格,我发现numberOfSectionsInTableView
被调用了3次,然后viewForHeaderInSection
又循环了3次来处理每个部分(我有2个部分,所以在第一次显示之前总共6次)...所有这些都是在第一个屏幕渲染之前完成的。
我知道这个API是私有的,但想知道是否有人愿意提供一些关于这种设计模式的见解,以及背后可能发生了什么,这样我就可以学习一些关于为什么这么多重复被认为是可接受的(甚至是有利的)的东西...或者更有可能的是,我如何搞砸了它的应用。
编辑:在RootViewController tableView首次显示之前添加堆栈跟踪
第一次调用viewForHeaderInSection:
#0 0x000086cc in -[RootViewController tableView:viewForHeaderInSection:] at RootViewController.m:444
#1 0x30c901a8 in -[UITableView(UITableViewInternal) _delegateWantsHeaderForSection:]
#2 0x30c8f6f4 in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:]
#3 0x30c8f5a8 in -[UITableViewRowData rectForFooterInSection:]
#4 0x30c3d430 in -[UITableViewRowData heightForTable]
#5 0x30c05430 in -[UITableView(_UITableViewPrivate) _updateContentSize]
#6 0x30c3ce0c in -[UITableView noteNumberOfRowsChanged]
#7 0x30c3c7c0 in -[UITableView reloadData]
#8 0x30e50e60 in -[UITableViewController viewWillAppear:]
#9 0x30c78810 in -[UINavigationController _startTransition:fromViewController:toViewController:]
#10 0x30c783b0 in -[UINavigationController _startDeferredTransitionIfNeeded]
#11 0x30c782a0 in -[UINavigationController viewWillLayoutSubviews]
#12 0x30c5c874 in -[UILayoutContainerView layoutSubviews]
#13 0x30c382d8 in -[UIView(CALayerDelegate) _layoutSublayersOfLayer:]
#14 0x33e871c0 in -[CALayer layoutSublayers]
#15 0x33e86edc in CALayerLayoutIfNeeded
#16 0x33e86844 in CA::Context::commit_transaction
#17 0x33e86474 in CA::Transaction::commit
#18 0x33e8e5dc in CA::Transaction::observer_callback
#19 0x32d5c830 in __CFRunLoopDoObservers
#20 0x32da4346 in CFRunLoopRunSpecific
#21 0x32da3c1e in CFRunLoopRunInMode
#22 0x31bb9374 in GSEventRunModal
#23 0x30bf3c30 in -[UIApplication _run]
#24 0x30bf2230 in UIApplicationMain
#25 0x00002260 in main at main.m:14
2nd call:
#0 0x000086cc in -[RootViewController tableView:viewForHeaderInSection:] at RootViewController.m:444
#1 0x30c901a8 in -[UITableView(UITableViewInternal) _delegateWantsHeaderForSection:]
#2 0x30c8f6f4 in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:]
#3 0x30c90628 in -[UITableViewRowData(UITableViewRowDataPrivate) _ensureSectionOffsetIsValidForSection:]
#4 0x30c8f5d0 in -[UITableViewRowData rectForFooterInSection:]
#5 0x30c3d430 in -[UITableViewRowData heightForTable]
#6 0x30c05430 in -[UITableView(_UITableViewPrivate) _updateContentSize]
#7 0x30c3ce0c in -[UITableView noteNumberOfRowsChanged]
#8 0x30c3c7c0 in -[UITableView reloadData]
#9 0x30e50e60 in -[UITableViewController viewWillAppear:]
#10 0x30c78810 in -[UINavigationController _startTransition:fromViewController:toViewController:]
#11 0x30c783b0 in -[UINavigationController _startDeferredTransitionIfNeeded]
#12 0x30c782a0 in -[UINavigationController viewWillLayoutSubviews]
#13 0x30c5c874 in -[UILayoutContainerView layoutSubviews]
#14 0x30c382d8 in -[UIView(CALayerDelegate) _layoutSublayersOfLayer:]
#15 0x33e871c0 in -[CALayer layoutSublayers]
#16 0x33e86edc in CALayerLayoutIfNeeded
#17 0x33e86844 in CA::Context::commit_transaction
#18 0x33e86474 in CA::Transaction::commit
#19 0x33e8e5dc in CA::Transaction::observer_callback
#20 0x32d5c830 in __CFRunLoopDoObservers
#21 0x32da4346 in CFRunLoopRunSpecific
#22 0x32da3c1e in CFRunLoopRunInMode
#23 0x31bb9374 in GSEventRunModal
#24 0x30bf3c30 in -[UIApplication _run]
#25 0x30bf2230 in UIApplicationMain
#26 0x00002260 in main at main.m:14
第三次呼叫:
#0 0x000086cc in -[RootViewController tableView:viewForHeaderInSection:] at RootViewController.m:444
#1 0x30c901a8 in -[UITableView(UITableViewInternal) _delegateWantsHeaderForSection:]
#2 0x30c3eebc in -[UITableView(_UITableViewPrivate) _updateVisibleHeadersAndFootersNow]
#3 0x30c3e578 in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow]
#4 0x30c3c514 in -[UITableView layoutSubviews]
#5 0x30c382d8 in -[UIView(CALayerDelegate) _layoutSublayersOfLayer:]
#6 0x33e871c0 in -[CALayer layoutSublayers]
#7 0x33e86edc in CALayerLayoutIfNeeded
#8 0x33e86844 in CA::Context::commit_transaction
#9 0x33e86474 in CA::Transaction::commit
#10 0x33e8e5dc in CA::Transaction::observer_callback
#11 0x32d5c830 in __CFRunLoopDoObservers
#12 0x32da4346 in CFRunLoopRunSpecific
#13 0x32da3c1e in CFRunLoopRunInMode
#14 0x31bb9374 in GSEventRunModal
#15 0x30bf3c30 in -[UIApplication _run]
#16 0x30bf2230 in UIApplicationMain
#17 0x00002260 in main at main.m:14
第四次呼叫:
#0 0x000086cc in -[RootViewController tableView:viewForHeaderInSection:] at RootViewController.m:444
#1 0x30c9712c in -[UITableView(UITableViewInternal) _sectionHeaderViewWithFrame:forSection:opaque:reuseViewIfPossible:]
#2 0x30c3f0b4 in -[UITableView(_UITableViewPrivate) _updateVisibleHeadersAndFootersNow]
#3 0x30c3e578 in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow]
#4 0x30c3c514 in -[UITableView layoutSubviews]
#5 0x30c382d8 in -[UIView(CALayerDelegate) _layoutSublayersOfLayer:]
#6 0x33e871c0 in -[CALayer layoutSublayers]
#7 0x33e86edc in CALayerLayoutIfNeeded
#8 0x33e86844 in CA::Context::commit_transaction
#9 0x33e86474 in CA::Transaction::commit
#10 0x33e8e5dc in CA::Transaction::observer_callback
#11 0x32d5c830 in __CFRunLoopDoObservers
#12 0x32da4346 in CFRunLoopRunSpecific
#13 0x32da3c1e in CFRunLoopRunInMode
#14 0x31bb9374 in GSEventRunModal
#15 0x30bf3c30 in -[UIApplication _run]
#16 0x30bf2230 in UIApplicationMain
#17 0x00002260 in main at main.m:14
第五次呼叫:
#0 0x000086cc in -[RootViewController tableView:viewForHeaderInSection:] at RootViewController.m:444
#1 0x30c901a8 in -[UITableView(UITableViewInternal) _delegateWantsHeaderForSection:]
#2 0x30c3eebc in -[UITableView(_UITableViewPrivate) _updateVisibleHeadersAndFootersNow]
#3 0x30c3e578 in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow]
#4 0x30c3c514 in -[UITableView layoutSubviews]
#5 0x30c382d8 in -[UIView(CALayerDelegate) _layoutSublayersOfLayer:]
#6 0x33e871c0 in -[CALayer layoutSublayers]
#7 0x33e86edc in CALayerLayoutIfNeeded
#8 0x33e86844 in CA::Context::commit_transaction
#9 0x33e86474 in CA::Transaction::commit
#10 0x33e8e5dc in CA::Transaction::observer_callback
#11 0x32d5c830 in __CFRunLoopDoObservers
#12 0x32da4346 in CFRunLoopRunSpecific
#13 0x32da3c1e in CFRunLoopRunInMode
#14 0x31bb9374 in GSEventRunModal
#15 0x30bf3c30 in -[UIApplication _run]
#16 0x30bf2230 in UIApplicationMain
#17 0x00002260 in main at main.m:14
第六次呼叫:
#0 0x000086cc in -[RootViewController tableView:viewForHeaderInSection:] at RootViewController.m:444
#1 0x30c9712c in -[UITableView(UITableViewInternal) _sectionHeaderViewWithFrame:forSection:opaque:reuseViewIfPossible:]
#2 0x30c3f0b4 in -[UITableView(_UITableViewPrivate) _updateVisibleHeadersAndFootersNow]
#3 0x30c3e578 in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow]
#4 0x30c3c514 in -[UITableView layoutSubviews]
#5 0x30c382d8 in -[UIView(CALayerDelegate) _layoutSublayersOfLayer:]
#6 0x33e871c0 in -[CALayer layoutSublayers]
#7 0x33e86edc in CALayerLayoutIfNeeded
#8 0x33e86844 in CA::Context::commit_transaction
#9 0x33e86474 in CA::Transaction::commit
#10 0x33e8e5dc in CA::Transaction::observer_callback
#11 0x32d5c830 in __CFRunLoopDoObservers
#12 0x32da4346 in CFRunLoopRunSpecific
#13 0x32da3c1e in CFRunLoopRunInMode
#14 0x31bb9374 in GSEventRunModal
#15 0x30bf3c30 in -[UIApplication _run]
#16 0x30bf2230 in UIApplicationMain
#17 0x00002260 in main at main.m:14