ตอนที่ 7 : Xamarin.iOS กับ Visual Studio สร้าง Action Segue ส่งค่า Parameters ข้าม View (C#)       | 
   
 
			  
			  
                ตอนที่ 7 : Xamarin.iOS กับ Visual Studio สร้าง Action Segue ส่งค่า Parameters ข้าม View (C#) ในการเขียน App บน iOS ที่มีจำนวนหน้าของ App หลาย ๆ หน้า ในที่นี้เราจะเรียกว่า View หรือ View Controller  ซึ่ง View นี้เป็นส่วนประกอบสำคัญที่ควบคุมการแสดงผลของ App  และแน่นอนว่า App ทั่ว ๆ ไปจะต้องมีจำนวนหน้ามากกว่า 1 หน้าแน่นอน และในแต่ล่ะหน้าเราอาจจะเห้นว่ามีการเชื่อมโยงข้อมูลระหว่างกัน ผ่านการ คลิกที่ Button หรือ Slide ในรูปแบบต่าง ๆ และเหตุการณ์ที่เกิดขึ้นจะมีการส่งค่าไปยังในหน้าอื่น ๆ อาจจะอยู่ในรูปแบบของ Master-Detail โดยรูปแบบการส่งค่านั้นมีหลากหลายรูปแบบ แต่ในบทความนี้จะแนะนำวิธีการส่งค่าแบบง่าย ๆ ผ่าน Action ของ Segue ที่อยู่บน Storyboard 
 
บทความใน ตอนที่ 5 เกี่ยวกับการสร้าง View ที่มีมากกว่าหนึ่ง View บน Soryboard การสร้าง Custom Class เพื่อ Mapping กับ View ที่อยู่ใน Storyboard และ Class ที่สร้างขึ้น รวมทั้งการสร้าง Action Segue เพื่อเชื่อมโยง View ซึ่งจะนำมาประยุคต่อให้ในบทความนี้ ฉะนั้นสมาชิกที่เพิ่งอ่านบทความนี้เป็นหัวข้อแรก แนะนำให้กลับไปอ่านในตอนที่ 5  
 
 
Xamarin.iOS Segue and Passing Parameters Between View 
 
ในการส่งค่า Parameters จะหว่าง View บน Xamarin.iOS ด้วยภาษา C# จะใช้หลักการเดียวกับการเขียน Windows Form App คือ Class ปลายทางที่จะรับค่านั้น จะต้องสร้าง Property ไว้สำหรับการรับค่า ซึ่ง Property นั้นสามารถกำหนด Data Type ได้ตามชนิดของข้อมูลที่ต้องการ เช่น String , Integer ,, Array , Object หรืออื่น ๆ และเมื่อมี Property แล้วฝั่งที่ส่งข้อมูลก็จะทำการอ้างถึง Class ปลายทาง พร้อมกับการส่งข้อมูล Parameters ในรูปแบบ Argument ซึ่งจะมีได้หลาย ๆ ตัว ไปกับ Class นั้น ๆ  
 
รูปแบบการรับส่ง Parameters ระว่าง View ผ่าน Action ของ Segue 
 
Send Parameters 
        public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
        {
            ((DetailViewController)segue.DestinationViewController).SetDetailItem("String Parameters");
        }
SetDetailItem คือ Property ของ Class ที่ที่จะส่งไป สามารถมีได้หลาย Argument 
 
Receive Parameters 
        object detailItem;
        public void SetDetailItem(object newDetailItem)
        {
            if (detailItem != newDetailItem)
            {
                detailItem = newDetailItem;
            }
        }
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            this.lblResult.Text = detailItem.ToString();
        }
 
 
 
 
กลับมายัง Xamarin.iOS โปคเจคบน Visual Studio 
 
  
 
ออกแบบหน้าจอ UI ดังรูป ซึ่งอยู่บน Storyboard ประกอบด้วย View จำนวน 2 View แต่ล่ะ View เชื่อมกับ Class 
- View แรกทำงานคู่กับ Class ของ RootViewController
 - View สองทำงานคู่กับ Class ของ DetailViewController
 
  
 
อ่านเพิ่มเติม : ตอนที่ 5 : โครงสร้าง Xamarin.iOS บน Visual Studio สร้าง View การเชื่อมโยง View ด้วย C# 
 
 
  
 
ทำการเชื่อม Segue ของ View แรกด้วยการคลิกที่ Button จากนั้นกดปุ่ม Ctrl บน Keyboard แล้วลากไปวางไว้บน View ที่สอง และเลือก Action แบบ Modal 
 
  
 
ในกรณีที่ต้องการใส่ค่า Effect ให้กับ Segue สามารถกำหนดที่ Properties -> Widget ดังรูป  
 
จากนั้นให้สร้าง Event ดังนี้ 
 
Class ของ View แรก สร้าง Method ชื่อว่า PrepareForSegue ซึ่งเป็นการ override  method ของการคลิกที่ Segue พร้อมกับส่งค่า Parameters ไปยัง View สอง 
        public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
        {
            ((DetailViewController)segue.DestinationViewController).SetDetailItem(this.txtName.Text);
        }
 
Class ของ View สอง สร้าง Property สำหรับการ รับค่า พร้อมกับ Get ค่าเพื่อเรียกค่า Parameters 
        object detailItem;
        public void SetDetailItem(object newDetailItem)
        {
            if (detailItem != newDetailItem)
            {
                detailItem = newDetailItem;
            }
        }
 
 
ทดสอบการทำงาน 
 
  
 
ทดสอบการ Input ข้อมูลใน View แรก และคลิกส่งไปยัง View ที่สอง 
 
  
 
ค่า Parameters จะถูกส่งมายัง View สอง และแสดงผลตามที่ต้องการ 
 
Code ทั้งหมด 
 
RootViewController.cs 
using System;
using System.Drawing;
using Foundation;
using UIKit;
namespace iOSApp
{
    public partial class RootViewController : UIViewController
    {
        public RootViewController(IntPtr handle)
            : base(handle)
        {
        }
        public override void DidReceiveMemoryWarning()
        {
            // Releases the view if it doesn't have a superview.
            base.DidReceiveMemoryWarning();
            // Release any cached data, images, etc that aren't in use.
        }
        #region View lifecycle
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            // Perform any additional setup after loading the view, typically from a nib.
        }
        public override void ViewWillAppear(bool animated)
        {
            base.ViewWillAppear(animated);
        }
        public override void ViewDidAppear(bool animated)
        {
            base.ViewDidAppear(animated);
        }
        public override void ViewWillDisappear(bool animated)
        {
            base.ViewWillDisappear(animated);
        }
        public override void ViewDidDisappear(bool animated)
        {
            base.ViewDidDisappear(animated);
        }
        #endregion
        public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
        {
            ((DetailViewController)segue.DestinationViewController).SetDetailItem(this.txtName.Text);
        }
    }
}
 
 
 
 
DetailViewController.cs 
using System;
using System.Drawing;
using Foundation;
using UIKit;
namespace iOSApp
{
    public partial class DetailViewController : UIViewController
    {
        object detailItem;
        public void SetDetailItem(object newDetailItem)
        {
            if (detailItem != newDetailItem)
            {
                detailItem = newDetailItem;
            }
        }
        public DetailViewController(IntPtr handle)
            : base(handle)
        {
        }
        public override void DidReceiveMemoryWarning()
        {
            // Releases the view if it doesn't have a superview.
            base.DidReceiveMemoryWarning();
            // Release any cached data, images, etc that aren't in use.
        }
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            this.lblResult.Text = detailItem.ToString();
            // Perform any additional setup after loading the view, typically from a nib.
        }
    }
}
              
  
              			
			  
								  
			  
  
                          
  | 
           
          
            
			  ช่วยกันสนับสนุนรักษาเว็บไซต์ความรู้แห่งนี้ไว้ด้วยการสนับสนุน Source Code 2.0 ของทีมงานไทยครีเอท 
              | 
           
          
 
       
		 
					
        
          
            
                
                   | 
                 
                
                  |   | 
                  By :  | 
                  ThaiCreate.Com Team (บทความเป็นลิขสิทธิ์ของเว็บไทยครีเอทห้ามนำเผยแพร่ ณ เว็บไซต์อื่น ๆ)  | 
                 
                
                  |   | 
                  Score Rating :  | 
                  
				      				   | 
                    | 
                 
                
                  |   | 
                  Create/Update Date :  | 
                  
                    2014-10-22 21:37:09            /
            2017-03-26 08:40:13 | 
                 
				
				
				                
                  |   | 
                  Download :  | 
                   
				 No files				   | 
                 
				              | 
           
         
		
      
         
           
            
            
              
                | 
               
                   Sponsored Links / Related |  
              | 
         
        
                        | 
          
		  
		   | 
         
         
          |             
		  
	
      
     | 
     
 
 
		  
         | 
		
          
		   
		  
              
      
     |