自己在跟一个教程入门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()
是什么时候触发呢?
Il existe généralement deux manières de connaître l'ordre d'exécution :
Définissez le point d'impression, qui est la fonction
print
Définissez des points d'arrêt. Pour des problèmes comme le vôtre, vous pouvez définir des points d'arrêt symboliques, puis afficher la pile d'appels. La séquence d'appel sera claire en un coup d'œil
1.didSelect
2.performSegue(withIdentifier : "ShowChecklist", expéditeur : checklist)
3.prepare(pour enchaînement : UIStoryboardSegue, expéditeur : Any ?)
En fait, si vous écrivez une impression personnalisée dans la méthode, vous connaîtrez l'ordre d'exécution