自己在跟一个教程入门iOS,有些问题不太清楚,希望得到解答。
简单的说就是checklist
对象通过sender从AllListsTableViewController
传送到ChecklistViewController
中,其中有用到的AllListsTableViewController
的prepare()
和tableView(didSelectRowAt)
两个方法,不太清楚执行顺序。
AllListsTableViewController.swift
import UIKit class AllListsTableViewController: UITableViewController { var lists: [Checklist] required init?(coder aDecoder: NSCoder) { lists = [Checklist]() super.init(coder: aDecoder) var list = Checklist(name: "Birthdays") lists.append(list) list = Checklist(name: "Groceries") lists.append(list) list = Checklist(name: "Cool App") lists.append(list) list = Checklist(name: "To Do") lists.append(list) } //点击任意一行,都需要吧对应的checklist对象放进prepare中 //prepare在viewDidLoad()之前 //通过sender 送到ChecklistViewController之后,viewDidLoad()才能更改标题 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "ShowChecklist" { let controller = segue.destination as! ChecklistViewController controller.checklist = sender as! Checklist } } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of rows return lists.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) let cell = makeCell(for: tableView) let checklist = lists[indexPath.row] cell.textLabel!.text = checklist.name cell.accessoryType = .detailDisclosureButton return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let checklist = lists[indexPath.row] //点击后把checklist放进segue performSegue(withIdentifier: "ShowChecklist", sender: checklist) } func makeCell(for tableView: UITableView) -> UITableViewCell { let cellIdentifier = "Cell" if let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) { return cell } else { //如果table view找不到一个cell去重用,就会到else这去手动创建一个cell return UITableViewCell(style: .default, reuseIdentifier: cellIdentifier) } } }
想了想应该就是对prepare()
不太了解,不太清楚它什么时候调用,点击row后触发tableView(didSelectRowAt)
后把checklist
对象放入segue中,但prepare()
是什么时候触发呢?
想要知道执行顺序一般有两种方式:
设置打印点,就是
print
函数了设置断点,像你这样的问题就可以设置符号断点,然后查看调用栈,调用顺序就一目了然了
1.didSelect
2.performSegue(withIdentifier: "ShowChecklist", sender: checklist)
3.prepare(for segue: UIStoryboardSegue, sender: Any?)
其实你在方法里面写个自定义的打印,就知道执行顺序了