Home  >  Q&A  >  body text

iOS中通过segue传值的问题

自己在跟一个教程入门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()是什么时候触发呢?

PHPzPHPz2764 days ago706

reply all(2)I'll reply

  • PHP中文网

    PHP中文网2017-04-18 09:42:26

    There are generally two ways to know the execution order:

    1. Set the print point, which is the print function

    2. Set breakpoints. For problems like yours, you can set symbolic breakpoints and then view the call stack. The calling sequence will be clear at a glance

    reply
    0
  • 迷茫

    迷茫2017-04-18 09:42:26

    1.didSelect
    2.performSegue(withIdentifier: "ShowChecklist", sender: checklist)
    3.prepare(for segue: UIStoryboardSegue, sender: Any?)

    In fact, if you write a custom print in the method, you will know the execution order

    reply
    0
  • Cancelreply