สร้าง Segue จาก Prototype Cell ใน Table View Controller ไป View Controller อื่น
ขั้นตอนใน Storyboard
- ลบ View Controller เริ่มต้น → เพิ่ม Table View Controller และ View Controller
- เลือก Prototype Cell → Attributes Inspector → Identifier: "cell"
- Ctrl+Drag จาก Cell → View Controller ใหม่ → เลือก Show (Push)
- คลิก Segue → Attributes Inspector → Identifier: "showDetail"
- ตั้ง 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