Data Passing  คือ การส่งข้อมูลจาก View Controller หนึ่งไปยังอีก View Controller  หนึ่ง จะเห็นตัวอย่างได้จาก หากต้องการเปลี่ยนหน้าแสดงผลจากอันหนึ่งไปอีกอันหนึ่งแล้วส่งข้อมูลไปด้วย 

Segue คือ เส้นทางที่จะเคลื่อนไป จากไหน ไปไหน

วิธีการสร้าง segue มี 2 วิธี

1.สร้างจาก view หรือ control ไปยัง Scene จะระบุไปว่า control ไหน ทำให้เปลี่ยนหน้าไปยังอีกหน้าหนึ่ง ไม่ต้อง prepare ข้อมูล และไม่ต้องมีการเรียก performSegue() คลิ๊กปุ๊บ เปลี่ยนหน้าปั๊บ

2.สร้างจาก Scene ไป ยัง Scene เป็นการระบุคร่าว ๆ ว่า มีเส้นทางที่จะเปลี่ยนจากอีก Scene หนึ่งไปอีก Scene หนึ่ง แต่จะต้องระบุ ชื่อ identify เพื่ออ้างอิง Segue เวลาจะใช้ก็เรียก performSegue()


1.เปิด Main.storyboard ขึ้นมา

ในกรณี view ไปยัง Scence ให้คลิ๊กขวาที่ปุ่ม Next ค้างไว้แล้วลากจาก View controller หนึ่ง มายังอีก View controller หนึ่ง 

ในกรณี Scence ไปยัง Scence ให้คลิ๊กขวาที่ view controller icon ค้างไว้แล้วลากจาก View controller หนึ่ง มายังอีก View controller หนึ่ง 

จะมีให้เลือก Manual Segue

-Popover เปิดหน้าต่างแบบ popover คลิ๊กข้างนอกก็หน้าต่างก็จะหายไป

-Custom เปิดหน้าต่างใหม่ (หน้าต่างเก่า-ใหม่ แยกกัน)

-Modal  เปิดหน้าต่างใหม่ (ต้องปิดหน้าต่างใหม่ก่อน จึงกลับไปยังหน้าต่างก่อนหน้าได้)

-Sheet  แสดงบนหน้าต่างเดิมในอีก Sheet หนึ่งที่อยู่ด้านบนสุด

-Show  เปิดหน้าต่างใหม่ (หน้าต่างเก่า-ใหม่ แยกกัน)

2.ตั้งชื่อ Segue Identifier เพื่อใช้อ้างอิง (ในตัวอย่างจะตั้งชื่อว่า  GoToMain)

การส่งค่าผ่าน Segue มี 3 ขั้นตอน

1.สร้าง segue ขึ้นมาก่อน (ในกรณีนี้ต้องใช้แบบ Scene ไปยัง Scene)

2.สร้าง prepare() เพื่อเตรียมส่งข้อมูล

3.บอกให้เปลี่ยนหน้าตอนไหน (segue.performSegue ตอนนั้น)

การส่งค่าผ่าน Segue โดยผู้เขียนขอแบ่งเป็น 2 วิธี

      แบบที่ 1. ส่งค่าไปตรง ๆ ผ่าน segue (อ่านว่า เซกเว)

      แบบที่ 2. ส่ง function เพื่อให้ส่งค่ากลับมา ผ่าน segue

มาดูโค๊ดกัน

แบบที่ 1. ส่งค่าไปตรง ๆ ผ่าน segue (อ่านว่า เซกเว)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import Cocoa
 
class ViewController: NSViewController  {
    var view_id:String = "u07500499"
    var view_name:String = "Google"
    var view_url:String = "https://google.com"
    var view_description:String = "google"
    var view_logo_path:String = "path for logo"
     
    override func prepare(for segue:NSStoryboardSegue,sender:Any?){
        
       if(segue.identifier == NSStoryboardSegue.Identifier("GoToSiteView")){
         
            let sv = segue.destinationController as! SiteViewController
            // pass data in main to Site View
            sv.site_id = self.view_id
            sv.site_name = self.view_name
            sv.site_url  =  self.view_url
            sv.site_description = self.view_description
            sv.site_logo_path = self.view_logo_path
        }
    }
    @IBAction func add(_ sender: NSButton) {
        self.performSegue(withIdentifier:NSStoryboardSegue.Identifier("GoToSiteView"),sender:self)
    }
    override func viewDidLoad() {
           super.viewDidLoad()
    }
}
 
 
class SiteViewController: NSViewController  {
    var site_id:String = ""
    var site_name:String = ""
    var site_url:String = ""
    var site_description:String = ""
    var site_logo_path:String = ""
 
    override func viewDidLoad() {
        super.viewDidLoad()
//you can use site_id , site_name , site_url , site_description , site_logo_path for initial Text Field or Image View
    }
}

แบบที่ 2. ส่ง function เพื่อให้ส่งค่ากลับมา ผ่าน segue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import Cocoa
 
class ViewController: NSViewController  {
    var view_id:String = ""
    var view_name:String = ""
    var view_url:String = ""
    var view_description:String = ""
    var view_logo_path:String = ""
     
    func onPassBack(id:String,name:String,url:String,description:String,logo_path:String){
            self.view_id = id
            self.view_name = name
            self.view_url = url
            self.view_description = description
            self.view_logo_path = logo_path
    }
    override func prepare(for segue:NSStoryboardSegue,sender:Any?){
        //prepare information before go to Site Info
        //send function to databack closure in Site Info
        if(segue.identifier ==  NSStoryboardSegue.Identifier("GoToSite")){
            let sif = segue.destinationController as! SiteInfoController
            sif.dataPassBack = {(s1,s2,s3,s4,s5) in
                self.onPassBack(id:s1,name:s2,url:s3,description:s4,logo_path:s5)
                self.dismissViewController(sif)  //dismiss Modal
            }
        }
    }
    @IBAction func add(_ sender: NSButton) {
        self.performSegue(withIdentifier:NSStoryboardSegue.Identifier("GoToSite"),sender:self)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
 
    }
}
class SiteInfoController: NSViewController {
    var site_id:String = ""
    var site_name:String = ""
    var site_url:String = ""
    var site_description:String = ""
    var site_logo_path:String = ""
    var dataPassBack:((String,String,String,String,String)->Void)?
    override func viewDidLoad() {
         super.viewDidLoad()
         self.site_id = "u07500498"
         self.site_name = "facebook"
         self.site_url = "https://facebook.com"
         self.site_description = "facebook"
         self.site_logo_path = "path for logo"
         
    }
    @IBAction func save(_ sender: NSButton) {
         self.dataPassBack?(self.site_id,self.site_name,self.site_url,self.site_description,self.site_logo_path)
    }
}


Another Lessons