Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

Push Segue จาก UITableViewCell ไป ViewController ใน Swift

สร้าง Segue จาก Prototype Cell ใน Table View Controller ไป View Controller อื่น

ขั้นตอนใน Storyboard

  1. ลบ View Controller เริ่มต้น → เพิ่ม Table View Controller และ View Controller
  2. เลือก Prototype Cell → Attributes Inspector → Identifier: "cell"
  3. Ctrl+Drag จาก Cell → View Controller ใหม่ → เลือก Show (Push)
  4. คลิก Segue → Attributes Inspector → Identifier: "showDetail"
  5. ตั้ง Storyboard ID ให้ View Controller ปลายทาง: "DetailVC"

โค้ด Table View Controller


class MyTableViewController: UITableViewController {
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = "Row \(indexPath.row)"
        return cell
    }
    
    // Prepare for Segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetail",
           let detailVC = segue.destination as? DetailViewController,
           let indexPath = tableView.indexPathForSelectedRow {
            
            detailVC.selectedRow = indexPath.row
            detailVC.itemTitle = "Row \(indexPath.row)"
        }
    }
}

Detail View Controller


class DetailViewController: UIViewController {
    var selectedRow: Int = 0
    var itemTitle: String = ""
    
    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        label.text = "Detail for \(itemTitle)"
        title = itemTitle
    }
}

Programmatic Segue (ไม่ใช้ Storyboard Segue)


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    
    let detailVC = storyboard?.instantiateViewController(withIdentifier: "DetailVC") as! DetailViewController
    detailVC.selectedRow = indexPath.row
    navigationController?.pushViewController(detailVC, animated: true)
}

Unwind Segue (กลับมา)


// ใน Source VC (Table VC)
@IBAction func unwindToTable(segue: UIStoryboardSegue) { }

// ใน Storyboard: Ctrl+Drag จากปุ่ม Back/Cancel → Exit Icon → เลือก unwindToTable

จุดสำคัญ

  • ต้อง Embed Table View Controller ใน Navigation Controller (Editor → Embed In → Navigation Controller)
  • Prototype Cell ต้องมี Reuse Identifier
  • Segue Kind = Show (Push) ไม่ใช่ Present Modally
  • prepare(for:sender:) ใช้ส่งข้อมูลก่อน Transition