iOS中通过segue传值的问题

查看:86
本文介绍了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()是什么时候触发呢?

解决方案

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

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

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

这篇关于iOS中通过segue传值的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆