iOS中通过segue传值的问题
PHPz
PHPz 2017-04-18 09:40:26
0
2
703

自己在跟一个教程入门iOS,有些问题不太清楚,希望得到解答。
简单的说就是checklist对象通过sender从AllListsTableViewController传送到ChecklistViewController中,其中有用到的AllListsTableViewControllerprepare()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()是什么时候触发呢?

PHPz
PHPz

学习是最好的投资!

répondre à tous(2)
Ty80

Il existe généralement deux manières de connaître l'ordre d'exécution :

  1. Définissez le point d'impression, qui est la fonction print

  2. 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

  3. .
迷茫

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!