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

自己在跟一个教程入门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

学习是最好的投资!

全部回复(2)
Ty80

想要知道执行顺序一般有两种方式:

  1. 设置打印点,就是print函数了

  2. 设置断点,像你这样的问题就可以设置符号断点,然后查看调用栈,调用顺序就一目了然了

迷茫

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

其实你在方法里面写个自定义的打印,就知道执行顺序了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!