首先,标准开局:打开 Xcode,新建一个项目。
随后,在 Main.storyboard 中拖入一个 Table View Controller,将「箭头」(Storyboard Entry Point)拖到它身上。
Main.storyboard
然后新建一个 UITableViewController 子类:
UITableViewController
再回到 Storyboard,将控制器设置为 DemoTableViewController:
DemoTableViewController
选中一个 Cell,设置它的 Reuse Identifier 为 Cell:
以上均为基本操作,此处假定你已经懂得了。如果你还不会,你应该从更基础的地方学习。
断点(Breakpoint)
Table view controller 有一些生命周期方法,除此以外,它还负责给 table view 提供数据、响应它的事件等等:
这些个方法,大家都已经熟络了。但你知不知道它们被调用的先后顺序是怎样的?
通过设置断点,你就能清楚地知道这一切了:
只要滑鼠在左边点一下,就能把断点设置上了。
这样,程序就会在断点位置暂停(当然,前提是 Xcode 必须和你的 App 保持连接):
击中断点时,断点所在的那行代码就绿了,提示你当前的状态:线程 1 击中断点 1.1。
从左侧面板可以看到,你现在正位于线程 1,处在 DemoTableViewController 实例的 viewDidLoad() 方法中。
viewDidLoad()
底部面板有一排工具栏。工具栏的下方左半边,显示了当前的所有变数;右半边有个神秘的 (lldb),它就是本系列文章的主角,但暂时先不提。
(lldb)
点击工具栏的继续按钮,程序就会继续运行:
继续不久,程序又会再次击中下一个断点。击中,继续,击中,继续……
这样,你就知道这些方法分别是什么时候被调用的了。
最终的调用顺序是:
viewWillAppear(_:)
numberOfSections(in:)
tableView(_:, numberOfRowsInSection:) -> Int
viewWillLayoutSubviews()
tableView(_:, cellForRowAt:) -> UITableViewCell
tableView(_:, heightForRowAt:) -> CGFloat
viewDidLayoutSubviews()
viewDidAppear(_:)
仔细看看,是不是和你脑海中的一样呢?