<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Macfeteria &#187; cocoa touch</title>
	<atom:link href="http://www.macfeteria.com/blog/tag/cocoa-touch/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.macfeteria.com</link>
	<description>All About Mac and iPhone Programming</description>
	<lastBuildDate>Tue, 09 Aug 2011 04:34:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>iPhone Programming VIIII : Table View ( Part 4) Custom Cell</title>
		<link>http://www.macfeteria.com/blog/2009/10/26/iphone-programming-viiii-table-view-part-4-custom-cell/</link>
		<comments>http://www.macfeteria.com/blog/2009/10/26/iphone-programming-viiii-table-view-part-4-custom-cell/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 09:54:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[UITableView]]></category>
		<category><![CDATA[UITableViewCell]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=1186</guid>
		<description><![CDATA[เห็นถามกันมาหลายคนครับ โปรแกรมหลายๆโปรแกรมใน iphone นั้นมีตารางที่มีทั้ง ปุ่ม ทั้งอะไรมากมาย ยกตัวอย่าง เช่น Setting ที่อยู่ในเครื่องอยู่แล้ว ลองกด เข้าไปดูครับจะเห็นว่า ในแต่ละ cell น้ันมีทั้ง switch on-off ทั้งตัวหนังสือ เค้าทำกันได้ยังไง ? คำตอบคือ Custom Cell ครับ วันนี้เราจะเขียน custom cell แบบง่ายๆกันครับ เพื่อเป็นแนวทางให้ไปประยุกต์ใช้กันต่อไป เอาละครับ เริ่มจากสร้างโปรเจคแบบ view base กันก่อน อย่างตัวอย่างนี้ผมตั้งชื่อว่า DemoCustomCell ครับ แล้วเราก็ เพิ่ม class ที่ชื่อว่า StudentData เข้าไปยังโปรเจค ส่วน code interface ก็ประมาณนี้ครับ @interface StudentData : NSObject &#123; NSString *studentName; NSString [...]]]></description>
			<content:encoded><![CDATA[<p>เห็นถามกันมาหลายคนครับ โปรแกรมหลายๆโปรแกรมใน iphone นั้นมีตารางที่มีทั้ง ปุ่ม ทั้งอะไรมากมาย ยกตัวอย่าง เช่น Setting ที่อยู่ในเครื่องอยู่แล้ว ลองกด เข้าไปดูครับจะเห็นว่า ในแต่ละ cell น้ันมีทั้ง switch on-off ทั้งตัวหนังสือ เค้าทำกันได้ยังไง ? คำตอบคือ Custom Cell ครับ</p>
<p>วันนี้เราจะเขียน custom cell แบบง่ายๆกันครับ เพื่อเป็นแนวทางให้ไปประยุกต์ใช้กันต่อไป เอาละครับ เริ่มจากสร้างโปรเจคแบบ view base กันก่อน อย่างตัวอย่างนี้ผมตั้งชื่อว่า DemoCustomCell ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/13.gif" rel="lightbox[1186]"><img class="size-medium wp-image-1187 aligncenter" title="1" src="http://www.macfeteria.com/wp-content/uploads/2009/10/13-300x212.gif" alt="1" width="300" height="212" /></a></p>
<p>แล้วเราก็ เพิ่ม class ที่ชื่อว่า StudentData เข้าไปยังโปรเจค ส่วน code interface ก็ประมาณนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> StudentData <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>studentName;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>studentGrade;
	UIImage <span style="color: #002200;">*</span>studentPicture;
&nbsp;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> studentName;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> studentGrade;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> UIImage <span style="color: #002200;">*</span>studentPicture;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>แล้วก็ส่วน implement ก็ไม่มีอะไรมากครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;StudentData.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> StudentData
<span style="color: #a61390;">@synthesize</span> studentName;
<span style="color: #a61390;">@synthesize</span> studentGrade;
<span style="color: #a61390;">@synthesize</span> studentPicture;
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>studentName release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>studentGrade release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>studentPicture release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จาก code ข้างบน ผมได้เขียน class ที่ชื่อว่า StudentData เพื่อที่จะเก็บ ชื่อ,เกรด และ รูปภาพ ของนักเรียน<br />
และลำดับต่อไป เราก็ออกแบบหน้าตา interface ของโปรแกรม โดยเพิ่ม ตารางเข้ามา พร้อมทั้ง set delegate และ datasource ให้กับตารางให้เรียบร้อย</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/1a.gif" rel="lightbox[1186]"><img class="size-medium wp-image-1188 aligncenter" title="1a" src="http://www.macfeteria.com/wp-content/uploads/2009/10/1a-300x222.gif" alt="1a" width="300" height="222" /></a></p>
<p>หลังจากนั้น ก็มาเขียนส่วนของ code ของ DemoCustomCell กันครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> DemoCustomCellViewController <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>studentArray;
	IBOutlet UITableView <span style="color: #002200;">*</span>studentTableView;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จาก code ข้างบน เราประกาศ studentArray เพื่อเอาไว้เก็บรายชื่อนักเรียน และมี IBOutlet ที่เป็น UITableView ไว้แสดงผลครับ</p>
<p>ลำดับต่อไป เราจะเขียนส่วนของ implement ก็แบบนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;DemoCustomCellViewController.h&quot;</span>
<span style="color: #6e371a;">#import &quot;StudentData.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> DemoCustomCellViewController
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	studentArray <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
	StudentData<span style="color: #002200;">*</span> student_A , <span style="color: #002200;">*</span>student_B , <span style="color: #002200;">*</span>student_C , <span style="color: #002200;">*</span>student_D;
&nbsp;
	student_A <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>StudentData alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
	student_B <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>StudentData alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
	student_C <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>StudentData alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
	student_D <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>StudentData alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
	student_A.studentName <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;น้องกระแต&quot;</span><span style="color: #002200;">&#93;</span>;
	student_A.studentGrade <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;A&quot;</span><span style="color: #002200;">&#93;</span>;
	student_A.studentPicture <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIImage imageNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;katae.png&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	student_B.studentName <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;น้องปีใหม่&quot;</span><span style="color: #002200;">&#93;</span>;
	student_B.studentGrade <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B+&quot;</span><span style="color: #002200;">&#93;</span>;
	student_B.studentPicture <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIImage imageNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;mai.png&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	student_C.studentName <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;น้องแพนเค้ก&quot;</span><span style="color: #002200;">&#93;</span>;
	student_C.studentGrade <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;C&quot;</span><span style="color: #002200;">&#93;</span>;
	student_C.studentPicture <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIImage imageNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;pancake.png&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	student_D.studentName <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;น้องเกรซ&quot;</span><span style="color: #002200;">&#93;</span>;
	student_D.studentGrade <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;B&quot;</span><span style="color: #002200;">&#93;</span>;
	student_D.studentPicture <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIImage imageNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;grace.png&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>studentArray addObject<span style="color: #002200;">:</span>student_A<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>studentArray addObject<span style="color: #002200;">:</span>student_B<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>studentArray addObject<span style="color: #002200;">:</span>student_C<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>studentArray addObject<span style="color: #002200;">:</span>student_D<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>student_A release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>student_B release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>student_C release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>student_D release<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidUnload
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>studentArray release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// -----------------------------------------------------------------</span>
<span style="color: #11740a; font-style: italic;">//			TableView Delegate Implement</span>
<span style="color: #11740a; font-style: italic;">// -----------------------------------------------------------------</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
numberOfRowsInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> section
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>studentArray count<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>table
		 cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath;
<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>sampleIndentifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;My Identifier&quot;</span>;
	UITableViewCell <span style="color: #002200;">*</span>cell;
        cell<span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span>studentTableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>
			sampleIndentifier<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectZero
		reuseIdentifier<span style="color: #002200;">:</span>sampleIndentifier<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
&nbsp;
	StudentData <span style="color: #002200;">*</span>temp <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>studentArray objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
	cell.textLabel.text <span style="color: #002200;">=</span> temp.studentName;
&nbsp;
	<span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จากข้างบน ผมได้เพิ่มนักเรียนเข้าไปยัง StudentArray รวมทั้งหมด 4 คนครับ และในส่วนของ table delegate นั้นก็ ได้กำหนดให้ cell นั้นแสดง ชื่อของนักเรียน และเมื่อเราทำการ compile ก็จะได้โปรแกรมแบบนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/31.gif" rel="lightbox[1186]"><img class="size-medium wp-image-1193 aligncenter" title="3" src="http://www.macfeteria.com/wp-content/uploads/2009/10/31-156x300.gif" alt="3" width="156" height="300" /></a></p>
<p>ไม่ยากใช่ไหมครับ ต่อไปเราจะเขียน Custom Cell ครับ</p>
<h2>Custom Cell</h2>
<p>จากโปรแกรมข้างบน เราจะเห็นว่า ข้อจำกัดของโปรแกรมคือ ในแต่ละ cell นั้นแสดงได้แค่ ตัวหนังสือ เท่านั้นและได้เพียงแค่หนึ่งแถว ถ้าหากเราอยากจะเพิ่ม ให้ cell ของเราแสดงข้อมูลได้มากกว่านี้ เราจะต้องทำ custom cell ครับ เอาละครับ เริ่มกันเลย ก่อนอื่นเราต้องเพิ่ม xib เข้ามายังโปรเจค ครับ ดังรูป ก็ click ขวาเลือก new file แล้วก็เลือกไปที่ Empty XIB ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/21.gif" rel="lightbox[1186]"><img class="size-medium wp-image-1194 aligncenter" title="2" src="http://www.macfeteria.com/wp-content/uploads/2009/10/21-300x214.gif" alt="2" width="300" height="214" /></a></p>
<p>แล้วก็ตั้งชื่อครับ ในตัวอย่างนี้ผมตั้งชื่อ StudentCustomCell.xib ครับ เมื่อเปิด File XIB ขึ้นมาก็จะเห็น เพียงแค่ File&#8217;s Owner กับ First Responder หลังจากนั้นให้ลาก UITableViewCell เข้ามายัง Document ของเรา ดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/4.gif" rel="lightbox[1186]"><img class="size-medium wp-image-1196 aligncenter" title="4" src="http://www.macfeteria.com/wp-content/uploads/2009/10/4-300x201.gif" alt="4" width="300" height="201" /></a></p>
<p>เอาละครับ ก่อนที่เราจะลงมือ ออกแบบหน้าตา Custom Cell ของเรา เราต้องเขียน Class ขึ้นมาก่อน และสำหรับ Custom Cell ที่ผมจะออกแบบนี้ ผมอยากให้ มี</p>
<ol>
<li>ชื่อของนักเรียน</li>
<li>เกรดของนักเรียน</li>
<li>รูปถ่ายนักเรียน</li>
</ol>
<p>เอาละครับ ต่อไปเราก็ลงมือเขียน StudentCustomCell Class ของเราเลย โดยการ Add New File อย่างที่เคยทำ นั่นเหละครับ แต่ให้เลือก SubClass  of ให้เป็น UITableViewCell แบบในรูปครับ แล้วก็ตั้งชื่อว่า StudentCustomCell</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/5.gif" rel="lightbox[1186]"><img class="size-medium wp-image-1197 aligncenter" title="5" src="http://www.macfeteria.com/wp-content/uploads/2009/10/5-300x214.gif" alt="5" width="300" height="214" /></a></p>
<p>แล้ว code ของ StudentCustomCell.h ก็ได้แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> StudentCustomCell <span style="color: #002200;">:</span> UITableViewCell
<span style="color: #002200;">&#123;</span>
	IBOutlet UILabel<span style="color: #002200;">*</span> name;
	IBOutlet UILabel<span style="color: #002200;">*</span> grade;
	IBOutlet UIImageView<span style="color: #002200;">*</span> picture;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span>  UILabel<span style="color: #002200;">*</span> name;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span>  UILabel<span style="color: #002200;">*</span> grade;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span>  UIImageView<span style="color: #002200;">*</span> picture;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ต่อไปก็เขียน implement ได้แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;StudentCustomCell.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> StudentCustomCell
&nbsp;
<span style="color: #a61390;">@synthesize</span> name;
<span style="color: #a61390;">@synthesize</span> grade;
<span style="color: #a61390;">@synthesize</span> picture;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithStyle<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableViewCellStyle<span style="color: #002200;">&#41;</span>style
        reuseIdentifier<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>reuseIdentifier <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super initWithStyle<span style="color: #002200;">:</span>style reuseIdentifier<span style="color: #002200;">:</span>reuseIdentifier<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">// Initialization code</span>
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setSelected<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>selected animated<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>animated <span style="color: #002200;">&#123;</span>
&nbsp;
    <span style="color: #002200;">&#91;</span>super setSelected<span style="color: #002200;">:</span>selected animated<span style="color: #002200;">:</span>animated<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>name release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>grade release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>picture release<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ครับเพียงเท่านี้ Class ของเราก็เกือบจะเสร็จละครับ ต่อไปเราก็กลับมายัง interface builder เพื่อที่จะออกแบบหน้าตา interface ของเราและ set link ต่างๆเข้ากับ class ที่เราได้เขียนขึ้นมา</p>
<h2>Design Custom Cell</h2>
<p>โดยลำดับแรกที่ต้องทำก็คือ เปิด inspector ขึ้นมาแล้วก็ set ให้ UITableViewCell ของเราเป็น Student Custom Cell ดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/6.gif" rel="lightbox[1186]"><img class="size-medium wp-image-1198 aligncenter" title="6" src="http://www.macfeteria.com/wp-content/uploads/2009/10/6-236x300.gif" alt="6" width="236" height="300" /></a></p>
<p>หลังจากได้เปลี่ยนให้ UITableViewCell เป็น StudentCustomCell แล้ว ก็ออกแบบหน้าตาของโปรแกรม พร้อมกับเชื่อม Outlet ต่างๆให้เรียบร้อยดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/7.gif" rel="lightbox[1186]"><img class="size-medium wp-image-1199 aligncenter" title="7" src="http://www.macfeteria.com/wp-content/uploads/2009/10/7-279x300.gif" alt="7" width="279" height="300" /></a></p>
<h2>Coding</h2>
<p>ลำดับต่อไปเราก็จะแก้ไข code กันครับ ก่อนที่จะแก้ไขหรือเปลี่ยนแปลงอะไรใน code เราต้องเข้าใจก่อนครับว่า ที่เราได้ทำไปทั้งหมด เมื่อกี้คืออะไร สิ่งที่เราได้ทำไปทั้งหมดนั้นคือ</p>
<ul>
<li>ประกาศ Custom Cell</li>
<li>ออกแบบ Custom Cell</li>
</ul>
<p>สุดท้ายที่จะทำก็คือ เอามาใช้ครับ วิธีการที่เราจะเอา Custom Cell ของเรามาใช้ ก็ไม่ยากครับ ถ้าสังเกตดีๆ จะเห็น code ส่วนของ table delegate  ตรงนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>table
		 cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath;
<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>sampleIndentifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;My Identifier&quot;</span>;
	UITableViewCell <span style="color: #002200;">*</span>cell;
	cell<span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span>studentTableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>
						   sampleIndentifier<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectZero
			reuseIdentifier<span style="color: #002200;">:</span>sampleIndentifier<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
&nbsp;
	StudentData <span style="color: #002200;">*</span>temp <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>studentArray objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
	cell.textLabel.text <span style="color: #002200;">=</span> temp.studentName;
&nbsp;
	<span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>จากตรง code ข้างบน จะเห็นว่า เราได้ประกาศ cell ขึ้นมาให้เป็น UITableViewCell ใช่ไหมครับ ? แล้วเราก็ทำการ alloc แล้วก็ init มัน เอาละ งั้นถ้าหากว่าเราต้องการให้มันเป็น custom cell ทำยังไงละครับ คำตอบก็ไม่ยากเลย ก็คือเราก็ประกาศให้ cell ของเราเป็น custom cell ซะก็เรียบร้อย งั้นเรามาดู code กันเลย</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>table
		 cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath;
<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>sampleIndentifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;My Identifier&quot;</span>;
	StudentCustomCell <span style="color: #002200;">*</span>cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>StudentCustomCell<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>studentTableView
		dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>sampleIndentifier<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>topLevelObjects;
	topLevelObjets <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span>
	loadNibNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;StudentCustomCell&quot;</span> owner<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> options<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span> currentObject <span style="color: #a61390;">in</span> topLevelObjects<span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>currentObject isKindOfClass<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>StudentCustomCell class<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
		<span style="color: #002200;">&#123;</span>
			cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>StudentCustomCell<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>currentObject;
			<span style="color: #a61390;">break</span>;
		<span style="color: #002200;">&#125;</span>
	<span style="color: #002200;">&#125;</span>
	<span style="color: #002200;">&#125;</span>
&nbsp;
	NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
&nbsp;
	StudentData <span style="color: #002200;">*</span>temp <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>studentArray objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
	cell.name.text <span style="color: #002200;">=</span> temp.studentName;
	cell.grade.text <span style="color: #002200;">=</span> temp.studentGrade;
	cell.picture.image <span style="color: #002200;">=</span> temp.studentPicture;
&nbsp;
	<span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>อธิบายจาก ข้างบนนะครับ เราได้ประกาศ cell ให้เป็น StudentCustomCell โดยที่เราได้โหลดจาก StudentCustomCell.XIB ( ตรงส่วนของ for loop เป็นแค่ส่วนที่ใช้หาว่า object ตัวไหนใน xib ที่เป็น StudentCustomCell เท่านั้นเอง )  หลังจากนั้นเราก็ ได้ใส่รูป ใส่ชื่อ ใส่เกรด ให้กับ cell ก็เป็นอันจบ เมื่อ compile &amp; run ก็จะเห็นผลลัพธ์ดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/result1.gif" rel="lightbox[1186]"><img class="size-medium wp-image-1202 aligncenter" title="result1" src="http://www.macfeteria.com/wp-content/uploads/2009/10/result1-156x300.gif" alt="result1" width="156" height="300" /></a></p>
<p>จะสังเกตเห็นว่า มันไม่พอดีกับ ตารางของเรา เราจำเป้นต้องเปลี่ยนความสูงของ cell ที่ใช้ โดยเพิ่ม</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>CGFloat<span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView
	heightForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #2400d9;">120</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p style="text-align: center;">เพียงเท่านี้ก็จะได้ผลลัพธ์เหมือนในรูปครับ<br />
<a href="http://www.macfeteria.com/wp-content/uploads/2009/10/result_done.png" rel="lightbox[1186]"><img class="size-medium wp-image-1203 aligncenter" title="result_done" src="http://www.macfeteria.com/wp-content/uploads/2009/10/result_done-156x300.png" alt="result_done" width="156" height="300" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">ลอง Download Code ไป Compile ดูได้ครับ <a href="http://www.macfeteria.com/wp-content/uploads/2009/10/DemoCustomCell.zip">DemoCustomCell</a></p>

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/cocoa+touch' rel='tag' target='_self'>cocoa touch</a>, <a class='technorati-link' href='http://technorati.com/tag/objective-c' rel='tag' target='_self'>objective-c</a>, <a class='technorati-link' href='http://technorati.com/tag/programming' rel='tag' target='_self'>programming</a>, <a class='technorati-link' href='http://technorati.com/tag/UITableView' rel='tag' target='_self'>UITableView</a>, <a class='technorati-link' href='http://technorati.com/tag/UITableViewCell' rel='tag' target='_self'>UITableViewCell</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/10/26/iphone-programming-viiii-table-view-part-4-custom-cell/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>iPhone Programming VII : Table View ( Part 3)</title>
		<link>http://www.macfeteria.com/blog/2009/07/16/iphone-programming-vii-table-view-part-3/</link>
		<comments>http://www.macfeteria.com/blog/2009/07/16/iphone-programming-vii-table-view-part-3/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 08:56:49 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[UITableView]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=976</guid>
		<description><![CDATA[วันนี้ก็ยังต่อเนื่องเกี่ยวกับเรื่องของ table view เหมือนเดิมนะครับ สืบเนื่องจากครั้งที่แล้วที่ผม ได้เขียน tutorial ในแบบลักษณะการเขียนย่อลง เอาแต่ส่วนที่สำคัญทำให้ผู้อ่านหลายๆคน บอกว่าน่าจะเอาแบบเดิม ( คือเริ่มตั้งแต่ สร้าง project ) เพราะ ยังประสบการณ์น้อย อ่านแล้วไม่เข้าใจ โอเค ครับ งั้นผมจะ พยายาม เขียน ในทุกๆขั้นตอนเลยละกัน ( แต่ในอนาคจะ ค่อยๆ ปรับลดลงนะครับ ) อย่างที่บอกไปว่าวันนี้ยังอยู่ในเรื่องของ table เหมือนเดิม วันนี้จะมาต่อในเรื่องของ Section ครับ โดยปกติแล้ว Table View น้ันจะประกอบไปด้วย cell และ cell เหล่านี้สามารถแยกเป็นหมวดๆได้ เรียนกว่า section ดูรูปประกอบ จะเข้าใจ จากรูปจะเห็นชื่อที่ขึ้นต้นด้วย ตัวอักษรเดียวกันนั้นจะถูกจับรวมกันเป็นกลุ่ม ( section ) งั้นเรามาเริ่มเลยดีกว่าครับ โปรแกรมที่เราจะเขียนกันในวันนี้ก็ไม่มีอะไรมากครับ คือเราจะเขียน [...]]]></description>
			<content:encoded><![CDATA[<p>วันนี้ก็ยังต่อเนื่องเกี่ยวกับเรื่องของ table view เหมือนเดิมนะครับ สืบเนื่องจากครั้งที่แล้วที่ผม ได้เขียน tutorial ในแบบลักษณะการเขียนย่อลง เอาแต่ส่วนที่สำคัญทำให้ผู้อ่านหลายๆคน บอกว่าน่าจะเอาแบบเดิม ( คือเริ่มตั้งแต่ สร้าง project ) เพราะ ยังประสบการณ์น้อย อ่านแล้วไม่เข้าใจ โอเค ครับ งั้นผมจะ พยายาม เขียน ในทุกๆขั้นตอนเลยละกัน ( แต่ในอนาคจะ ค่อยๆ ปรับลดลงนะครับ )</p>
<p>อย่างที่บอกไปว่าวันนี้ยังอยู่ในเรื่องของ table เหมือนเดิม วันนี้จะมาต่อในเรื่องของ Section ครับ<br />
โดยปกติแล้ว Table View น้ันจะประกอบไปด้วย cell และ cell เหล่านี้สามารถแยกเป็นหมวดๆได้ เรียนกว่า section ดูรูปประกอบ จะเข้าใจ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/table_section.png" rel="lightbox[976]"><img class="size-medium wp-image-977 aligncenter" title="table_section" src="http://www.macfeteria.com/wp-content/uploads/2009/07/table_section-156x300.png" alt="table_section" width="156" height="300" /></a></p>
<p style="text-align: left;">
<p>จากรูปจะเห็นชื่อที่ขึ้นต้นด้วย ตัวอักษรเดียวกันนั้นจะถูกจับรวมกันเป็นกลุ่ม ( section ) งั้นเรามาเริ่มเลยดีกว่าครับ</p>
<p>โปรแกรมที่เราจะเขียนกันในวันนี้ก็ไม่มีอะไรมากครับ คือเราจะเขียน โปรแกรม ไว้เก็บรายชื่อของสัตว์ต่างๆ แล้วก็แยกตามหมวดหมู่เท่านั้นเอง แต่ก่อนที่จะเริ่มดูภาพประกอบกันก่อนครับว่า โครงสร้างของโปรแกรม เราเป็นแบบไหน จะได้เข้าใจกันก่อนสักนิดว่า เรากำลังจะทำอะไร</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/chart.png" rel="lightbox[976]"><img class="size-medium wp-image-980 aligncenter" title="chart" src="http://www.macfeteria.com/wp-content/uploads/2009/07/chart-300x125.png" alt="chart" width="300" height="125" /></a></p>
<p style="text-align: left;">ตามแผนภาพ ผมจะแบ่งหมวดหมู่ของสัตว์ออกเป็น 3 ประเภทคือ Mammal , Bird , Fish แล้วแต่ละประเภท นั้นก็จะมีรายชื่อของ สัตว์ต่างๆ การออกแบบ คลาสต่างๆ ก็จะเหมือนดังแผนภาพ ครับ นั่นก็คือ ผมมี class ที่ชื่อ Animal เป็น ทั้ง datasource , delegate ( NSTableView ) เมื่อดูภาพประกอบคร่าวๆ เรียบร้อยแล้ว ต่อไปก็เริ่มโปรเจคกันเลย</p>
<p style="text-align: left;">Start New Project</p>
<p style="text-align: left;">เราก็เลือก view based application ครับ แล้วหลังจากนั้นก็ตั้งชื่ออะไรก็ได้ ในตัวอย่างนี้ผมจะใช้ชื่อว่า AnimalDemo เสร็จแล้วก็จะได้โปรเจคออกมาดังรูปแบบนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/new_project.png" rel="lightbox[976]"><img class="size-medium wp-image-981 aligncenter" title="new_project" src="http://www.macfeteria.com/wp-content/uploads/2009/07/new_project-300x212.png" alt="new_project" width="300" height="212" /></a></p>
<p style="text-align: left;">เมื่อเรียบร้อยแล้ว ลำดับต่อไป เราก็จะออกแบบหน้าตาของโปรแกรมเราก่อน ก็ทำการเปิด AnimalDemoViewController.xib ขึ้นมา แล้วก็ลาก Table View เข้ามาดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/table_demo.png" rel="lightbox[976]"><img class="size-medium wp-image-982 aligncenter" title="table_demo" src="http://www.macfeteria.com/wp-content/uploads/2009/07/table_demo-191x300.png" alt="table_demo" width="191" height="300" /></a></p>
<p style="text-align: left;">ก็เป็นอันเสร็จ การออกแบบหน้าตาของโปรแกรม  หลังจากนี้ ลำดับต่อไปก็คือ เขียน class ที่เป็น datasource และ delegate นั่นเอง<br />
เราจะทำการเพิ่ม class เข้ามายัง project ของเราโดยการ เลือกไปที่เมนู File &gt; New File&#8230; แล้วก็เลือก ชนิดของ File ดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/new_class.png" rel="lightbox[976]"><img class="size-medium wp-image-983 aligncenter" title="new_class" src="http://www.macfeteria.com/wp-content/uploads/2009/07/new_class-300x206.png" alt="new_class" width="300" height="206" /></a></p>
<p style="text-align: left;">หลังจากนั้นก็ตั้งชื่อว่า Animal ก็เป็นอันเสร็จเรียบร้อย ต่อไปเราก็จะมาเขียน code กัน</p>
<h2 style="text-align: left;">Implement Delegate &amp; Data Source</h2>
<p style="text-align: left;">อย่างที่เห็นในแผนภาพ ไปแล้ว ว่าเรามี class ที่ชื่อ Animal ที่ประกอบไปด้วย Array ที่เก็บรายชื่อของ สัตว์ต่างๆ เวลาเขียน code ออกมาก็จะได้ประมาณนี้ครับ</p>
<p style="text-align: left;">

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;Animal.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> Animal
<span style="color: #a61390;">@synthesize</span> m_animal;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> init
<span style="color: #002200;">&#123;</span>
	self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span>;
	m_animal <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableDictionary</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSMutableArray</span><span style="color: #002200;">*</span> mammal<span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithObjects<span style="color: #002200;">:</span>
		<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Dog&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Cat&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Rabbit&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Tiger&quot;</span>,<span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span> ;
&nbsp;
	<span style="color: #400080;">NSMutableArray</span><span style="color: #002200;">*</span> bird <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithObjects<span style="color: #002200;">:</span>
		 <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Eagle&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hawk&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Parrot&quot;</span>,<span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSMutableArray</span><span style="color: #002200;">*</span> fish <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithObjects<span style="color: #002200;">:</span>
		 <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Shark&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Barrachuda&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Gold Fish&quot;</span><span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>m_animal setObject<span style="color: #002200;">:</span>mammal forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mammal&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_animal setObject<span style="color: #002200;">:</span>bird forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Bird&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_animal setObject<span style="color: #002200;">:</span>fish forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Fish&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
<span style="color: #11740a; font-style: italic;">// Total Section</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> numberOfSectionsInTableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> table
<span style="color: #002200;">&#123;</span>
	NSInteger totalSection <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.m_animal count<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> totalSection;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// Number of row in each section</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
			 numberOfRowsInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> section
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> key <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.m_animal allKeys<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> keyValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>key objectAtIndex<span style="color: #002200;">:</span>section<span style="color: #002200;">&#93;</span>;
	NSInteger rowCount <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self.m_animal objectForKey<span style="color: #002200;">:</span>keyValue<span style="color: #002200;">&#93;</span> count<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> rowCount;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// Name of each section</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
			 titleForHeaderInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> section
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> allKeys <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.m_animal allKeys<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> name<span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span>allKeys objectAtIndex<span style="color: #002200;">:</span>section<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> name;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>UITableViewCell<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
		cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> indexPath
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>sampleIndentifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;My Identifier&quot;</span>;
	UITableViewCell <span style="color: #002200;">*</span>cell<span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span>tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>
						sampleIndentifier<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
	cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectZero
		reuseIdentifier<span style="color: #002200;">:</span>sampleIndentifier<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
	NSUInteger section <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath section<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> key <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.m_animal allKeys<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> keyValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>key objectAtIndex<span style="color: #002200;">:</span>section<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> animalList <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_animal objectForKey<span style="color: #002200;">:</span>keyValue<span style="color: #002200;">&#93;</span>;
	cell.textLabel.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>animalList objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>m_animal release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<h2>Explain</h2>
<p>ดู code แล้วอาจจะค่อนข้างจะยาวนิดหนึ่งนะครับ ค่อยๆทำความเข้าใจกันในแต่ละส่วนก่อนดีกว่า</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> init
<span style="color: #002200;">&#123;</span>
	self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span>;
	m_animal <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableDictionary</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSMutableArray</span><span style="color: #002200;">*</span> mammal<span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithObjects<span style="color: #002200;">:</span>
		<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Dog&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Cat&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Rabbit&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Tiger&quot;</span>,<span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span> ;
&nbsp;
	<span style="color: #400080;">NSMutableArray</span><span style="color: #002200;">*</span> bird <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithObjects<span style="color: #002200;">:</span>
		 <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Eagle&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hawk&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Parrot&quot;</span>,<span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSMutableArray</span><span style="color: #002200;">*</span> fish <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithObjects<span style="color: #002200;">:</span>
		 <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Shark&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Barrachuda&quot;</span>,<span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Gold Fish&quot;</span><span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>m_animal setObject<span style="color: #002200;">:</span>mammal forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Mammal&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_animal setObject<span style="color: #002200;">:</span>bird forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Bird&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_animal setObject<span style="color: #002200;">:</span>fish forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Fish&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>ฟังก์ชั่นนี้ ไม่ได้มีอะไรมากนอกจาก ประกาศ array ที่ประกอบไปด้วยรายชื่อของสัตว์ต่างๆ และนำมันไปใส่ไว้ใน dictionary ( m_animal ) จริงๆแล้วเราจะใช้ array ทั้งหมดก็ได้นะครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Total Section</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> numberOfSectionsInTableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> table
<span style="color: #002200;">&#123;</span>
	NSInteger totalSection <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.m_animal count<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> totalSection;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// Number of row in each section</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
			 numberOfRowsInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> section
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> key <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.m_animal allKeys<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> keyValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>key objectAtIndex<span style="color: #002200;">:</span>section<span style="color: #002200;">&#93;</span>;
	NSInteger rowCount <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self.m_animal objectForKey<span style="color: #002200;">:</span>keyValue<span style="color: #002200;">&#93;</span> count<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> rowCount;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// Name of each section</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
			 titleForHeaderInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> section
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> allKeys <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.m_animal allKeys<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> name<span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span>allKeys objectAtIndex<span style="color: #002200;">:</span>section<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> name;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>สองฟังก์ชั่น ข้างบน นั้น เป็นการบอกว่า ตารางนี้ประกอบไปด้วย section ทั้งหมดเท่าไหร่ และแต่ละ section นั้นมีแถวจำนวนเท่าไหร่<br />
ซึ่งจำนวน section ของเราทั้งหมดนั้นมี จะมีเท่ากับ จำนวน array ที่ได้เก็บไว้ใน m_animal นั่นก็คือ 3 และจำนวน แถวของแต่ละ section นั้นก็หามาจาก จำนวนชื่อของสัตว์ในแต่ละ array ที่ได้เก็บไว้นั่นเอง<br />
และฟังก์ชั่นสุดท้าย ก็คือ ชื่อของแต่ละ section ในตัวอย่างผมได้ให้ ชื่อของแต่ละ section น้ันเป็นชื่อของ key ที่ผมได้ใส่ไปใน dictionary ตอนสร้างครั้งแรกนั่นเอง</p>
<p>หมายเหตุ ใน Dictionary เราไม่สามารถจะขอข้อมูลที่เราได้ใส่ไปถ้าหากไม่มี key ดังนั้นแล้ว ผมจึงใช้ ** [NSDictionary allKey] เพื่อที่จะได้ key ทั้งหมดกลับมาซึ่งจะเป็น array ** หลังจากนั้นแล้วค่อยไปไล่หาค่าต่างๆตามลำดับ index ใน array อีกที</p>
<p>ส่วนสุดท้ายก็คือ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>UITableViewCell<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
		cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> indexPath
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>sampleIndentifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;My Identifier&quot;</span>;
	UITableViewCell <span style="color: #002200;">*</span>cell<span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span>tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>
						sampleIndentifier<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
	cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectZero
		reuseIdentifier<span style="color: #002200;">:</span>sampleIndentifier<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
	NSUInteger section <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath section<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> key <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.m_animal allKeys<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> keyValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>key objectAtIndex<span style="color: #002200;">:</span>section<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span> animalList <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_animal objectForKey<span style="color: #002200;">:</span>keyValue<span style="color: #002200;">&#93;</span>;
	cell.textLabel.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>animalList objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>เราได้ implement delegate เพื่อที่ตารางจะได้รู้ว่าควรนำอะไรไปแสดง ในแต่ละ section , row<br />
จาก code ข้างบน อธิบายคร่าวก็คือ เมื่อเรา ได้ index path มาแล้วเราหากลุ่มจาก section เมื่อเรารู้กลุ่มแล้ว หลังจากนั้นก็ไปหา ชื่อของสัตว์ตามลำดับของแถว ที่ควรจะแสดง</p>
<p>ก็เป็นอันจบในส่วนของ Animal Class</p>
<p>แต่ยังเหลือในส่วนของ View Controller ที่เรายังไม่ได้เขียนเพิ่มครับ เราต้อง เพิ่ม Animal เข้าไปยัง View Controller ของเรา ก็เปิด File ที่ชื่อ AnimalDemoViewController.h ขึ้นมาครับ<br />
หลังจากนั้นก็เพิ่ม code เข้าไปดังนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;Animal.h&quot;</span>
<span style="color: #a61390;">@interface</span> AnimalDemoViewController <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	IBOutlet Animal <span style="color: #002200;">*</span>m_animalDataSource;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span> Animal<span style="color: #002200;">*</span> m_animalDataSource;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>แล้วส่วน implement ก็จะเป็นประมาณนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;AnimalDemoViewController.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> AnimalDemoViewController
<span style="color: #a61390;">@synthesize</span> m_animalDataSource;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>didReceiveMemoryWarning <span style="color: #002200;">&#123;</span>
	<span style="color: #11740a; font-style: italic;">// Releases the view if it doesn't have a superview.</span>
    <span style="color: #002200;">&#91;</span>super didReceiveMemoryWarning<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>m_animalDataSource release<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ก็เป็นอันเสร็จ อธิบายกันสักนิด ที่เราได้เพิ่มเข้าไปก็คือ Animal ( m_animalDataSource ) แต่เราได้ประกาศให้เป็น Outlet เพื่อที่ว่าจะได้นำไป link กับตารางที่อยู่ interface builder ครับ</p>
<p>Link Object</p>
<p>กลับไปยัง interface builder ครับ เรายังเหลือสิ่งที่ต้องทำอีก อย่างสองอย่าง นั่นก็คือ สร้าง instance ของ Animal ก็เริ่มจาก เปิด AnimalDemoViewController.xib ขึ้นมา หลังจากนั้นก็เพิ่ม Object เข้าไปดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/animal_object.png" rel="lightbox[976]"><img class="size-medium wp-image-1005 aligncenter" title="animal_object" src="http://www.macfeteria.com/wp-content/uploads/2009/07/animal_object-272x300.png" alt="animal_object" width="272" height="300" /></a></p>
<p>จากรูป เมื่อ ลาก Object เข้ามาแล้ว เราก็เปิด หน้าต่าง inspector ขึ้นมาครับ แล้วตรง indentity จะเห็น Class เราก็เปลี่ยนให้เป็น Animal ก็เรียบร้อย เพียงเท่านี้เราก็มี Animal Instance เรียบร้อย  หลังจากนั้นก็เชื่อมมันเข้ากับ m_animalDataSource ของเรา ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/link_instance.png" rel="lightbox[976]"><img class="size-medium wp-image-1006 aligncenter" title="link_instance" src="http://www.macfeteria.com/wp-content/uploads/2009/07/link_instance-300x239.png" alt="link_instance" width="300" height="239" /></a></p>
<p>และลำดับสุดท้ายครับ เราต้อง set datasource ให้กับตารางของเรา เราก็ click ขวาไปยังตาราง แล้วก็ลาก เชื่อมเข้ากับ Animal Instance ดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/link_data-source.png" rel="lightbox[976]"><img class="size-medium wp-image-1007 aligncenter" title="link_data-source" src="http://www.macfeteria.com/wp-content/uploads/2009/07/link_data-source-300x222.png" alt="link_data-source" width="300" height="222" /></a></p>
<p>ก็เป็นอันเสร็จทุกๆอย่างครับ Compile แล้วก็ Run จะเห็นโปรแกรมมีหน้าตา แบบนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/animal_done.png" rel="lightbox[976]"><img class="size-medium wp-image-1008 aligncenter" title="animal_done" src="http://www.macfeteria.com/wp-content/uploads/2009/07/animal_done-156x300.png" alt="animal_done" width="156" height="300" /></a></p>
<p>ครั้งหน้าเดี๋ยวมาต่อกัน ในเรื่องของ ตารางต่อนะครับ<br />
ตัวอย่าง Source Code ก็กด <a title="Animal Source Code" href="http://www.macfeteria.com/wp-content/uploads/2009/07/AnimalDemo.zip">Download</a> ได้เลยครับ</p>

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/basic' rel='tag' target='_self'>basic</a>, <a class='technorati-link' href='http://technorati.com/tag/cocoa+touch' rel='tag' target='_self'>cocoa touch</a>, <a class='technorati-link' href='http://technorati.com/tag/objective-c' rel='tag' target='_self'>objective-c</a>, <a class='technorati-link' href='http://technorati.com/tag/programming' rel='tag' target='_self'>programming</a>, <a class='technorati-link' href='http://technorati.com/tag/UITableView' rel='tag' target='_self'>UITableView</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/07/16/iphone-programming-vii-table-view-part-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Programming VI : Table View ( Path 2 )</title>
		<link>http://www.macfeteria.com/blog/2009/07/14/iphone-programming-iv-table-view-path-2/</link>
		<comments>http://www.macfeteria.com/blog/2009/07/14/iphone-programming-iv-table-view-path-2/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 07:36:32 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[UITableView]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=953</guid>
		<description><![CDATA[วันนี้มาต่อเรื่องของ table view กันหน่อยดีกว่า Adding Image to Cell เมื่อครั้งก่อน เราได้ใช้งาน table view ที่ไว้แสดงผลแต่ตัวหนังสือ จริงๆแล้วเราสามารถเพิ่ม รูปภาพเข้าไปยัง cell ได้ด้วย วิธีการก็ไม่ได้ยากอะไรเลยครับ เราก็เพียงแต่ สร้าง image ขึ้นมาแล้วก็ set ให้ cell เท่านั้นเองดูตัวอย่างอาจจะเข้าใจง่ายกว่า จากการ implement ของ method - (UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath; ในครั้งก่อน เราจะทำการเพิ่ม image เข้าไป โดยเพิ่ม code เข้าไปดังนี้ครับ - &#40;UITableViewCell *&#41;tableView:&#40;UITableView *&#41;tableView cellForRowAtIndexPath:&#40;NSIndexPath *&#41;indexPath &#123; static NSString *identifier [...]]]></description>
			<content:encoded><![CDATA[<p>วันนี้มาต่อเรื่องของ table view กันหน่อยดีกว่า</p>
<h2>Adding Image to Cell</h2>
<p>เมื่อครั้งก่อน เราได้ใช้งาน table view ที่ไว้แสดงผลแต่ตัวหนังสือ จริงๆแล้วเราสามารถเพิ่ม รูปภาพเข้าไปยัง cell ได้ด้วย วิธีการก็ไม่ได้ยากอะไรเลยครับ เราก็เพียงแต่ สร้าง image ขึ้นมาแล้วก็ set ให้ cell เท่านั้นเองดูตัวอย่างอาจจะเข้าใจง่ายกว่า จากการ implement ของ method<br />
- (UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath;<br />
ในครั้งก่อน เราจะทำการเพิ่ม image เข้าไป โดยเพิ่ม code เข้าไปดังนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView
   cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>identifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria Cell&quot;</span>;
	UITableViewCell <span style="color: #002200;">*</span>cell;
	cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>identifier<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectZero
			reuseIdentifier<span style="color: #002200;">:</span> identifier<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// New Code !!!!</span>
	UIImage <span style="color: #002200;">*</span>image <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIImage imageNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;face.png&quot;</span><span style="color: #002200;">&#93;</span>;
	cell.imageView.image <span style="color: #002200;">=</span> image;
	<span style="color: #11740a; font-style: italic;">//-------------</span>
&nbsp;
	cell.textLabel.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_studentList objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>จะเห็นว่า เราได้เขียน code ขึ้นมาเพิ่มเพียง 2 บรรทัดเองครับ คือ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">	UIImage <span style="color: #002200;">*</span>image <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIImage imageNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;face.png&quot;</span><span style="color: #002200;">&#93;</span>;
	cell.imageView.image <span style="color: #002200;">=</span> image;</pre></div></div>

<p>เมื่อ run program หน้าตาก็จะเป็นประมาณแบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/table_with_image.gif" rel="lightbox[953]"><img class="size-medium wp-image-958 aligncenter" title="table_with_image" src="http://www.macfeteria.com/wp-content/uploads/2009/07/table_with_image-156x300.gif" alt="table_with_image" width="156" height="300" /></a></p>
<h2>Row Selection</h2>
<p>วิธีการจัดการเกี่ยวกับการเลือกแถวในตาราง เราอาจจะใช้ method ที่ใช้ถามว่าแถวไหนถูกเลือกอยู่ โดยเรียกใช้ method ที่ชื่อว่า indexPathForSelectedRow ก็ได้ครับ ตารางก็จะบอกเรามาว่าแถวไหนถูกเลือกอยู่ ดังตัวอย่าง</p>
<p>สมมติว่า ผมเขียน IBAction สำหรับ Button ไว้ชื่อว่า getSelectRow นะครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> getSelectRow<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
   <span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span>path <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_tableView indexPathForSelectedRow<span style="color: #002200;">&#93;</span>;
   <span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>selectRow;
   selectRow <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Row: %d&quot;</span>,<span style="color: #002200;">&#91;</span>path row<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
   m_text.text <span style="color: #002200;">=</span> selectRow;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>ผลลัพธ์ก็จะมีหน้าตาประมาณนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/table_with_row_selected.gif" rel="lightbox[953]"><img class="size-medium wp-image-959 aligncenter" title="table_with_row_selected" src="http://www.macfeteria.com/wp-content/uploads/2009/07/table_with_row_selected-156x300.gif" alt="table_with_row_selected" width="156" height="300" /></a></p>
<p>เมื่อกด ไปที่ตาราง แล้วก็กด ปุ่มมันก็จะบอกว่า เราเลือกที่แถวไหน ทำได้ไม่ยากเลยครับ<br />
และ table view นั้นมี delegate ที่เกี่ยวกับการเลือกแถวที่น่าสนใจ ได้แก่ delegate แรกจะเป็นการเขียนเหตุการณ์ที่เกิดขึ้นก่อนการเลือกแถว ที่ชื่อว่า<br />
-(NSInteger) tableView: (UITableView*) tableView willSelectRowAtIndexPath: (NSIndexPath*) indexPath<br />
ตัวอย่าง code จะเป็นประมาณนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
willSelectRowAtIndexPath<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> indexPath
<span style="color: #002200;">&#123;</span>
   NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
   <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> row <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
&nbsp;
   <span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>selectRow;
   selectRow <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Row: %d&quot;</span>,<span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
   m_text.text <span style="color: #002200;">=</span> selectRow;
&nbsp;
   <span style="color: #a61390;">return</span> indexPath;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>เราอาจจะเอา button ออก แต่เมื่อกดไปที่ตาราง มันก็จะบอกแถวมาเรียบร้อยเลย เพราะว่าเมื่อตารางถูกเลือก มันจะมาเรียก delegate โดยอัตโนมัติ เหมือนกับรูปข้างล่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/table_with_row_delegate.gif" rel="lightbox[953]"><img class="size-medium wp-image-960 aligncenter" title="table_with_row_delegate" src="http://www.macfeteria.com/wp-content/uploads/2009/07/table_with_row_delegate-156x300.gif" alt="table_with_row_delegate" width="156" height="300" /></a></p>
<p style="text-align: left;">และมีอีก delegate ที่น่าสนใจคือ เหตุการณ์หลังจากกดไปที่แถวของตาราง นั่นก็คือ<br />
-(void) tableView: (UITableView*) tableView didSelectRowAtIndexPath: (NSIndexPath*) indexPath<br />
ตัวอย่าง code การใช้งานก็จะเช่นว่า เราต้องการให้มันแสดง alert ขึ้นมาหลังจากกดไปที่แถวของตารางนะครับ ก็จะเขียนได้ประมาณนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
didSelectRowAtIndexPath<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> indexPath
<span style="color: #002200;">&#123;</span>
   NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
   <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>rowData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_nameList objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
&nbsp;
   <span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>msg;
   msg <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Animal: %@&quot;</span>,rowData<span style="color: #002200;">&#93;</span>;
   UIAlertView <span style="color: #002200;">*</span>alert;
   alert <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIAlertView alloc<span style="color: #002200;">&#93;</span> initWithTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;You select&quot;</span>
              message<span style="color: #002200;">:</span>msg delegate<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>
	      cancelButtonTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Ok !!&quot;</span> otherButtonTitles<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
   <span style="color: #002200;">&#91;</span>alert show<span style="color: #002200;">&#93;</span>;
   <span style="color: #002200;">&#91;</span>alert release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>หน้าตาหลังจาก run program ก็จะเป็นแบบนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/07/table_with_delegate_alert.gif" rel="lightbox[953]"><img class="size-medium wp-image-961 aligncenter" title="table_with_delegate_alert" src="http://www.macfeteria.com/wp-content/uploads/2009/07/table_with_delegate_alert-156x300.gif" alt="table_with_delegate_alert" width="156" height="300" /></a></p>
<p style="text-align: left;">วันนี้ก็จบเพียงเท่านี้ครับ ครั้งหน้า เดี๋ยวมาต่อด้วย custom cell</p>

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/basic' rel='tag' target='_self'>basic</a>, <a class='technorati-link' href='http://technorati.com/tag/cocoa+touch' rel='tag' target='_self'>cocoa touch</a>, <a class='technorati-link' href='http://technorati.com/tag/iphone' rel='tag' target='_self'>iphone</a>, <a class='technorati-link' href='http://technorati.com/tag/objective-c' rel='tag' target='_self'>objective-c</a>, <a class='technorati-link' href='http://technorati.com/tag/programming' rel='tag' target='_self'>programming</a>, <a class='technorati-link' href='http://technorati.com/tag/UITableView' rel='tag' target='_self'>UITableView</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/07/14/iphone-programming-iv-table-view-path-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>iPhone Programming V : Multiple View</title>
		<link>http://www.macfeteria.com/blog/2009/06/03/iphone-programming-v-multiple-view/</link>
		<comments>http://www.macfeteria.com/blog/2009/06/03/iphone-programming-v-multiple-view/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 05:11:29 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=915</guid>
		<description><![CDATA[ในครั้งที่แล้วเราได้ทดลองใช้งาน Table View กันไปบ้างแล้ว จริงๆผมว่าจะเขียน table view ต่อนะ แต่ว่าเห็นหลายคนที่ตาม twitter ผมบอกว่า อยากให้เขียนเกี่ยวกับ Project Template ต่างๆว่ามันใช้งานอย่างไร ก็เอาเป็นว่า วันนี้ผมจะพาทุกท่านไปเขียน iPhone โดยเริ่มจาก Project  ที่ไม่ใช่แบบ View Base App กันดีไหม ? จะได้เป็นการเข้าใจ การทำงานของ View Controller เพิ่มขึ้นไปด้วย เอาละครับ สำหรับวันนี้ เราจะเขียนโปรแกรมที่มีหลายๆ  View กันดูดีกว่า เพราะว่าตั้งแต่เราได้หัดเขียนมานั้น ผมก็ได้เขียนโปรแกรมเป็นลักษณะ  View เดียวตลอดเลย โปรแกรมที่เราจะได้ลองเขียนกันในวันนี้ ก็จะมีหน้าตา แบบนี้ครับ ดูจากหน้าตา(กระแต)คร่าวๆ คิดว่าคงพอจะทำให้เริ่มอยากลงมือทำกันเลยทีเดียว แต่ช้าก่อน &#8230;. อธิบายโปรแกรมกันคร่าวๆ กันก่อนละกัน โปรแกรมที่เราจะเขียนก็ไม่มีอะไรซับซ้อนครับ นอกจาก กดปุ่ม First ก็จะเห็น View [...]]]></description>
			<content:encoded><![CDATA[<p>ในครั้งที่แล้วเราได้ทดลองใช้งาน Table View กันไปบ้างแล้ว จริงๆผมว่าจะเขียน table view ต่อนะ แต่ว่าเห็นหลายคนที่ตาม twitter ผมบอกว่า อยากให้เขียนเกี่ยวกับ Project Template ต่างๆว่ามันใช้งานอย่างไร ก็เอาเป็นว่า วันนี้ผมจะพาทุกท่านไปเขียน iPhone โดยเริ่มจาก Project  ที่ไม่ใช่แบบ View Base App กันดีไหม ? จะได้เป็นการเข้าใจ การทำงานของ View Controller เพิ่มขึ้นไปด้วย</p>
<p>เอาละครับ สำหรับวันนี้ เราจะเขียนโปรแกรมที่มีหลายๆ  View กันดูดีกว่า เพราะว่าตั้งแต่เราได้หัดเขียนมานั้น ผมก็ได้เขียนโปรแกรมเป็นลักษณะ  View เดียวตลอดเลย โปรแกรมที่เราจะได้ลองเขียนกันในวันนี้ ก็จะมีหน้าตา แบบนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/overall.png" rel="lightbox[915]"><img class="size-medium wp-image-917 aligncenter" title="overall" src="http://www.macfeteria.com/wp-content/uploads/2009/06/overall-156x300.png" alt="overall" width="156" height="300" /></a></p>
<p>ดูจากหน้าตา(กระแต)คร่าวๆ คิดว่าคงพอจะทำให้เริ่มอยากลงมือทำกันเลยทีเดียว แต่ช้าก่อน &#8230;. อธิบายโปรแกรมกันคร่าวๆ กันก่อนละกัน โปรแกรมที่เราจะเขียนก็ไม่มีอะไรซับซ้อนครับ นอกจาก กดปุ่ม First ก็จะเห็น View อันแรกของเรา และเมื่อ กด Second มันก็จะสลับเอาอีก View ขึ้นมา เท่านั้นเอง</p>
<h2>Let&#8217;s Start</h2>
<p>อย่างที่เกริ่นไว้ตั้งแต่ตอนแรกแล้วครับว่า เราจะลองเขียนโปรแกรมโดยใช้ Template อื่นๆนอกเหนือจาก View Based Application. เราจะได้ลองมาใช้งาน Windows Based Application กัน ก็ก่อนอื่นเราก็สร้างโปรเจคแบบ Windows Based Application อย่างในรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/winbased.png" rel="lightbox[915]"><img class="size-medium wp-image-918 aligncenter" title="winbased" src="http://www.macfeteria.com/wp-content/uploads/2009/06/winbased-300x215.png" alt="winbased" width="300" height="215" /></a></p>
<p>แล้วเราก็ตั้งชื่อตามใจชอบครับ ในตัวอย่างนี้ผมตั้งชื่อโปรเจคผมว่า MultiView เป็นต้น เมื่อเราสร้างโปรเจคเรียบร้อยแล้ว จะเห็นหน้าตา Project ประมาณดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/newproject.png" rel="lightbox[915]"><img class="size-medium wp-image-919 aligncenter" title="newproject" src="http://www.macfeteria.com/wp-content/uploads/2009/06/newproject-300x186.png" alt="newproject" width="300" height="186" /></a></p>
<p>จะสังเกตว่า File เริ่มต้นที่ XCode ให้มานั้นค่อนข้างจะน้อยทีเดียว และสิ่งที่ขาดหายไปจากการสร้างโปรเจคแบบ View Based Application นั่นก็คือ File ที่มีชื่อประมาณว่า xxxxViewController.h และ xxxxViewController.m นั่นเอง และในโปรแกรมที่เราจะเขียนขึ้นเราก็จะเขียน view controller ของเราเอง</p>
<p>การทำงานของโปรเจคแบบนี้ อธิบายได้คร่าวว่า เมื่อเวลาที่ Program เริ่มทำงา หลังจากนั้นโปรแกรมก็จะสร้าง AppDelegate ขึ้นมา และ AppDelegate นี้เองก็จะประกอบไปด้วยหน้าต่าง (UIWindows) ซึ่งจัดเป็น View เหมือนกัน แต่อย่างที่บอกไปครับว่า เราต้องการให้โปรแกรมของเรา มีหลายๆ View ดังนั้นเราก็ต้องสร้าง View Controller ขึ้นมา เพื่อควบคุม View หลักอื่นๆ ถ้าหากดูตามแผลภาพใหญ่ๆ ก็จะได้ประมาณดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/relation.png" rel="lightbox[915]"><img class="size-medium wp-image-920 aligncenter" title="relation" src="http://www.macfeteria.com/wp-content/uploads/2009/06/relation-300x171.png" alt="relation" width="300" height="171" /></a></p>
<p>ดังนั้นแล้ว สิ่งที่เราจะทำต่อไปก็คือ เพิ่ม View Controller เข้าไป</p>
<p>1. อย่างแรกก็คือให้เราเพิ่ม Class เข้าไปยังโปรเจค โดย Class ที่เราจะเพ่ิมเข้าไปก็คือ UIViewController นั่นเหละครับ ดังตัวอย่างรูปข้างล่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/newclass.png" rel="lightbox[915]"><img class="size-medium wp-image-922 aligncenter" title="newclass" src="http://www.macfeteria.com/wp-content/uploads/2009/06/newclass-300x234.png" alt="newclass" width="300" height="234" /></a></p>
<p>แล้วก็ตั้งชื่อครับ อย่างตัวอย่างนี้ผมตั้งชื่อว่า MultiviewController ก็เป็นอันเรียบร้อย</p>
<p>2. เมื่อเรามี View Controller ที่เอาไว้จัดการ View แล้ว สิ่งที่เราต้องการเพิ่มเติมก็คือ ตัว content view ที่ใช้งานจริงๆ ในกรณีนี้ผมต้องการ 2 อันที่มีหน้าตาคล้ายๆกัน ให้ชื่อว่า First กับ Second ก็แล้วกันนะครับ ซึ่ง First กับ Second นี้เราอยากจะให้ มันเป็นคนละ Xib ด้วยเลย  ดังนั้นเราจะเพิ่ม class เข้าไป และ class ที่เราจะเพ่ิมเข้าไปก็คือ UIViewController ( เพื่อความง่ายในการ load view จาก xib  ) โดยตั้งชื่อว่า FirstView กับ SecondView</p>
<p>สรุปตอนนี้ เราได้เพิ่ม Class เข้ามาทั้งหมด 3 class ด้วยกัน โดย ทั้งหมดนั้นเป็น UIViewController หมดเลย ซึ่งประกอบไปด้วย</p>
<ul>
<li>MultiViewController<br />
เป็นตัวจัดการ Content View ซึ่งนั่นก็คือ FirstView กับ SecondView</li>
<li>FirstView และ SecondView<br />
เป็น Content View ที่ประกอบไปด้วย control อื่นๆเช่น image , button เป็นต้น</li>
</ul>
<p>3. เมื่อเรามี Class ต่างๆแล้ว ต่อไปเราก็จะเพิ่ม Xib File เข้ามายังโปรเจค ก็ทำคล้ายกับการเพ่ิม class น่ันเหละครับ แต่เราก็เลือก ชนิดของ File ให้เป็น View Xib เหมือนดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/xib.png" rel="lightbox[915]"><img class="size-medium wp-image-926 aligncenter" title="xib" src="http://www.macfeteria.com/wp-content/uploads/2009/06/xib-300x215.png" alt="xib" width="300" height="215" /></a></p>
<p>โดยให้ชื่อว่า First กับ Second เพื่อที่จะได้รู้ว่า xib  นี้เป็นของ class ไหน</p>
<h2>Design Interface</h2>
<p>เมื่อเรามี class ต่างๆแล้ว ลำดับต่อไป เราก็จะออกแบบหน้าตาโปรแกรม ของเราครับ อันดับแรก เราจะออกแบบหน้าตา Xib แรก ของเราก่อนนั่นก็คือ MainWindow.xib หน้าตาออกมาประมาณนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/mainxib.png" rel="lightbox[915]"><img class="size-medium wp-image-927 aligncenter" title="mainxib" src="http://www.macfeteria.com/wp-content/uploads/2009/06/mainxib-191x300.png" alt="mainxib" width="191" height="300" /></a></p>
<p>ผมได้ใส่ Segment Control เข้าไป เพื่อที่ว่า จะได้กด สลับระหว่าง First กับ Second ครับ<br />
และก็ต่อด้วย First.xib ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/firstxib.png" rel="lightbox[915]"><img class="size-medium wp-image-928 aligncenter" title="firstxib" src="http://www.macfeteria.com/wp-content/uploads/2009/06/firstxib-191x300.png" alt="firstxib" width="191" height="300" /></a></p>
<p>ส่วนหน้าตาของ Second.xib ก็อาจจะเป็นแบบนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/secondxib.png" rel="lightbox[915]"><img class="size-medium wp-image-929 aligncenter" title="secondxib" src="http://www.macfeteria.com/wp-content/uploads/2009/06/secondxib-191x300.png" alt="secondxib" width="191" height="300" /></a></p>
<p>จริงๆแล้วไม่จำเป็นต้อง ออกแบบหน้าตา แบบนี้ก็ได้นะครับ</p>
<h2>Code</h2>
<p>ในส่วนของการเขียนโปรแกรมนั้น ถ้าหากดูจากแผนภาพที่ 4 ก็จะเห็นว่า AppDelegate นั้นมี ViewController ฉนั้นแล้ว ก็เดาได้เลยครับว่า เราจะเพิ่ม View Controller เข้าไปยัง AppDelegate มาดู Code ส่วน MultiViewAppDelegate.h กันเลยครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MultiViewAppDelegate <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
	UIWindow <span style="color: #002200;">*</span>window;
	MultiViewController <span style="color: #002200;">*</span>m_viewController;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> IBOutlet UIWindow <span style="color: #002200;">*</span>window;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> IBOutlet MultiViewController <span style="color: #002200;">*</span>m_viewController;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ดูจาก code ข้างบน ก็ได้เพิ่ม View Controller เข้าไปครับ นั่นก็คือ MultiViewController นั่นเอง ส่วน implement นั้นก็มีแก้ไขนิดหน่อยครับ โดยเราจะแก้ method นี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>applicationDidFinishLaunching<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIApplication <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>application <span style="color: #002200;">&#123;</span>    
&nbsp;
	<span style="color: #11740a; font-style: italic;">// Override point for customization after application launch</span>
	<span style="color: #002200;">&#91;</span>window addSubview<span style="color: #002200;">:</span>m_viewController.view<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>window makeKeyAndVisible<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>เราได้เพิ่มไปแค่ 1 บรรทัดครับ นั่นก็คือ addSubview: นั่นเอง เพื่อที่จะได้ให้ MultiViewController เป็นตัวควบคุม view อื่นๆให้กับ AppDelegate นั่นเอง</p>
<p>ยังเหลือ ส่วนสำคัญที่เราต้องเขียนเพิ่มนั่นก็คือ View Controller ของเรานั่นเอง เอาละครับ เปิด MultiViewController.h ขึ้นมาแล้วก็แก้ไข Code ให้เป็นแบบนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MultiViewController <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	FirstView <span style="color: #002200;">*</span>m_firstView;
	SecondView <span style="color: #002200;">*</span>m_secondView;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>retain, nonatomic<span style="color: #002200;">&#41;</span> FirstView <span style="color: #002200;">*</span>m_firstView;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>retain, nonatomic<span style="color: #002200;">&#41;</span> SecondView <span style="color: #002200;">*</span>m_secondView;
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> changeViews<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จาก code ข้างบนจะเห็นว่า controller ของเรา ประกอบไปด้วย FisrtView กับ SecondView และเราก็มี method ที่ชื่อว่า changeView เพื่อที่จะทำหน้าที่สลับ view นั่นเองครับ</p>
<p>สุดท้ายแล้วครับ เราก็เขียนส่วนของ implement ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> MultiViewController
<span style="color: #a61390;">@synthesize</span> m_firstView;
<span style="color: #a61390;">@synthesize</span> m_secondView;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	FirstView <span style="color: #002200;">*</span>first;
	first <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>FirstView alloc<span style="color: #002200;">&#93;</span> initWithNibName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;FirstView&quot;</span> bundle<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
	self.m_firstView <span style="color: #002200;">=</span> first;
	<span style="color: #002200;">&#91;</span>self.view insertSubview<span style="color: #002200;">:</span>m_firstView.view atIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>first release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> changeViews<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> self.m_secondView <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		self.m_secondView <span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>SecondView alloc<span style="color: #002200;">&#93;</span>
		initWithNibName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;SecondView&quot;</span> bundle<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	<span style="color: #11740a; font-style: italic;">// Switch View</span>
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> m_firstView.view.superview <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span> 	<span style="color: #002200;">&#91;</span>m_secondView.view removeFromSuperview<span style="color: #002200;">&#93;</span>;
 		<span style="color: #002200;">&#91;</span>self.view insertSubview<span style="color: #002200;">:</span>m_firstView.view atIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	<span style="color: #a61390;">else</span>
	<span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span>m_firstView.view removeFromSuperview<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>self.view insertSubview<span style="color: #002200;">:</span>m_secondView.view atIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
 <span style="color: #002200;">&#125;</span>  
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc
 <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>m_firstView release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>เราจะมาดู viewDidload กันก่อนละกันนะครับ อธิบายคร่าวๆก็คือ เราสร้าง FirstView ด้วยการโหลด Xib และหลังจากนั้นก็ให้ FirstView ที่เราได้สร้าง กลายมาเป็น subview ของ MultiViewController อาจจะสงสัยว่าแล้วไม่โหลด SecondView หรืออย่างไร จริงๆแล้วก็โหลดได้ครับ แต่ที่ยังไม่โหลดตอนนี้ ก็เพราะว่า เราต้องการจะประหยัดหน่วยความจำ ค่อยไปโหลดทีหลัง เมื่อจำเป็นต้องใช้งาน</p>
<p>เอาละครับ มาดูกันต่อในส่วนของ changeViews ครับ<br />
ในส่วนนี้นั้น คร่าวๆก็คือ เราตรวจสอบว่า View ไหนแสดงผลอยู่ แล้วหลังจากนั้นก็ให้  View นั้นได้ถูกนำออกไป (  removeFromSuperview ) แล้วก็โหลด view ใหม่เข้ามาแทน และจะเห็นว่า มาโหลด SecondView ทีหลังครับ</p>
<h2>Link With Interface</h2>
<p>หลังจากเขียนโปรแกรมกันคร่าวๆ แล้วลำดับต่อไปก็คือ การเชื่อม interface ให้เข้ากับ code นั่นเอง เราก็ย้อนกลับไปยัง interface builder ครับ โดยเราจะเปิด MainMenu.xib ขึ้นมาก่อน</p>
<ul>
<li>ให้ลาก View Controller เข้ามายัง Document Windows ของเราครับ</li>
<li>หลังจากนั้น set class ใน attribute windows ให้เป็น MultiViewController ดูรูปประกอบครับ</li>
</ul>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/multiinterface.png" rel="lightbox[915]"><img class="size-medium wp-image-931 aligncenter" title="multiinterface" src="http://www.macfeteria.com/wp-content/uploads/2009/06/multiinterface-300x231.png" alt="multiinterface" width="300" height="231" /></a></p>
<p>และลำดับสุดท้ายสำหรับ MainMenu.xib นี้ เราจะเชื่อม Segment Control เข้ากับ changeView: ครับ ดูรูปประกอบ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/changeview.png" rel="lightbox[915]"><img class="size-medium wp-image-932 aligncenter" title="changeview" src="http://www.macfeteria.com/wp-content/uploads/2009/06/changeview-300x197.png" alt="changeview" width="300" height="197" /></a></p>
<p>เสร็จเรียบร้อย เราก็เปิด xib ตัวต่อไปครับ นั่นก็คือ FirstView.xib สิ่งที่เราจะทำก็คือ เราจะเปลี่ยน File&#8217;s Owner ให้เป็น FirstView ครับ ดูรูปประกอบ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/firstview.png" rel="lightbox[915]"><img class="size-medium wp-image-933 aligncenter" title="firstview" src="http://www.macfeteria.com/wp-content/uploads/2009/06/firstview-300x243.png" alt="firstview" width="300" height="243" /></a></p>
<p>แล้วก็เปิด SecondView.xib ขึ้นมาแล้วก็เปลี่ยน File&#8217;s Owner ให้เป็น SecondView</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/secondview.png" rel="lightbox[915]"><img class="size-medium wp-image-948 aligncenter" title="secondview" src="http://www.macfeteria.com/wp-content/uploads/2009/06/secondview-300x288.png" alt="secondview" width="300" height="288" /></a></p>
<p>เพียงเท่านี้ก็เป็นอันเสร็จเรียบร้อย ลอง Compile ดูครับ ว่าได้ผลลัพธ์เป็นอย่างไร หรือ โหลดตัวอย่างที่ผมทำไว้ไปลองเล่นได้ครับ ใครสงสัยอะไร หรือติชมก็เม้นกันได้ครับ</p>
<p>ไว้เจอกันครั้งหน้าครับ</p>
<p><a href="http://www.macfeteria.com/wp-content/uploads/2009/06/multiview.zip">Download Project Multiple View</a></p>

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/cocoa+touch' rel='tag' target='_self'>cocoa touch</a>, <a class='technorati-link' href='http://technorati.com/tag/iphone' rel='tag' target='_self'>iphone</a>, <a class='technorati-link' href='http://technorati.com/tag/programming' rel='tag' target='_self'>programming</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/06/03/iphone-programming-v-multiple-view/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>iPhone Programming IV : Table View ( Path 1 )</title>
		<link>http://www.macfeteria.com/blog/2009/04/09/iphone-programming-iv-table-view-path-1/</link>
		<comments>http://www.macfeteria.com/blog/2009/04/09/iphone-programming-iv-table-view-path-1/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 06:11:50 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[UITableView]]></category>
		<category><![CDATA[UITableViewCell]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=870</guid>
		<description><![CDATA[Table View นั้นเป็น Control ที่ค่อนข้างจะใช้งานเยอะมากๆ และทรงพลังมาก ถ้าเราดูโปรแกรมหลายๆโปรแกรมจะพบว่า ได้มีการประยุกต์ table view ใช้งานต่างๆมากมาย เช่นเปิดโปรแกรม Photos ก็เห็นแล้วว่ามี table view  หรือ  Contacts เป็นต้น ( ดูรูปประกอบ จะเห็นว่าทั้งหมดนี้ ล้วนแต่ใช้ table view ทั้งนั้น แต่ต่างกันในส่วนว่าจะแสดงอะไร มีรูป หรือมี control อื่นๆด้วยหรือเปล่า ) และวันนี้เราจะมาลองใช้งาน table view กันครับ Table View ใน Cocoa touch นั้นต่างกับใน Cocoa ปกติอยู่พอสมควร แต่โครงสร้างหลักๆ และหลักการ รวมถึงวิธีการใช้งานก็เหมือนเดิม ฉนั้นแล้วคนที่เคยใช้ NSTableView มาก่อน ก็หวานหมูเลย จริงๆแล้วข้อแตกต่างที่เห็นได้ชัดๆเลยก็คือ Table View ใน [...]]]></description>
			<content:encoded><![CDATA[<p>Table View นั้นเป็น Control ที่ค่อนข้างจะใช้งานเยอะมากๆ และทรงพลังมาก ถ้าเราดูโปรแกรมหลายๆโปรแกรมจะพบว่า ได้มีการประยุกต์ table view ใช้งานต่างๆมากมาย เช่นเปิดโปรแกรม Photos ก็เห็นแล้วว่ามี table view  หรือ  Contacts เป็นต้น ( ดูรูปประกอบ จะเห็นว่าทั้งหมดนี้ ล้วนแต่ใช้ table view ทั้งนั้น แต่ต่างกันในส่วนว่าจะแสดงอะไร มีรูป หรือมี control อื่นๆด้วยหรือเปล่า )</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/table_example.png" rel="lightbox[870]"><img class="size-medium wp-image-871 aligncenter" title="table_example" src="http://www.macfeteria.com/wp-content/uploads/2009/04/table_example-300x187.png" alt="table_example" width="300" height="187" /></a></p>
<p>และวันนี้เราจะมาลองใช้งาน table view กันครับ</p>
<p>Table View ใน Cocoa touch นั้นต่างกับใน Cocoa ปกติอยู่พอสมควร แต่โครงสร้างหลักๆ และหลักการ รวมถึงวิธีการใช้งานก็เหมือนเดิม ฉนั้นแล้วคนที่เคยใช้ NSTableView มาก่อน ก็หวานหมูเลย จริงๆแล้วข้อแตกต่างที่เห็นได้ชัดๆเลยก็คือ Table View ใน Cocoa touch นั้นสามารถแสดงผลได้ทีละ 1 column เท่านั้น !!! ใน Cocoa touch นั้นจะมี Class เป็น table view ชื่อว่า UITableView และแต่ละ object ที่อยู่ในแถวจะเรียกว่า Cell ( UITableViewCell ) และเนื่องจากว่า cell นั้นเป็น subclass ของ UIView  นั่นหมายความว่า เราสามารถ ใส่ control ต่างๆที่เป็น UIView หรือ subclass ของ UIView เข้าไปใน cell ได้มากมาย อาจจะใส่รูป ใส่ปุ่มกด ตัวหนังสือก็ได้ หรือแม้กระทั่งใส่ table view เข้าไปก็ยังได้ ( เห็นไหมครับว่ามันสามารถปรับแต่งได้สุดๆ )</p>
<p>ก่อนที่เราจะเริ่มผมอยากจะให้กลับไปทำความเข้าใจ เกี่ยวกับการทำงานของ table และ delegate ก่อน</p>
<p>UITableView จะมี helper object ที่ชื่อว่า data source ช่วยในการแสดงผลของข้อมูล ซึ่งการทำงานของ UITableView จะไม่ใช่ลักษณะที่ตัวโปรแกรมเป็นคนสั่งบอกกับ UITableView ว่าให้แสดงคำว่า Saved Photo ในแถวที่หนึ่ง แต่ในทางกลับกัน UITableView มันจะไปถาม helper object เองว่าในแถวที่หนึ่งมีอะไรที่ต้องแสดง ในกรณีนี้ datasource ก็จะส่ง Saved Photo(1) กลับมาให้ยัง NSTable แบบรูปข้างล่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/table.png" rel="lightbox[870]"><img class="size-medium wp-image-874 aligncenter" title="table" src="http://www.macfeteria.com/wp-content/uploads/2009/04/table-300x141.png" alt="table" width="300" height="141" /></a></p>
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: left;">และในการใช้งาน UITableView นั้นเราต้อง implement delegate method ( หากไม่เข้าใจ delegate ควรไปอ่าน <a href="http://www.macfeteria.com/2008/07/cocoa-programming-delegate/">cocoa programming delegate</a> ) ด้วยกัน 2 อย่างคือ</p>
<ul>
<li>-(int) <strong>numberOfRowInTableView</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> NSTableView*) tableView;<br />
ส่งค่าของจำนวน row กลับมา</li>
<li>-(id) <strong>tableView</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> NSTableView *) tableView<br />
<strong>objectValueForTableColumn</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> NSTableColumn*) tableColumn<br />
<strong>row</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> int) rowIndex;<br />
ส่ง object ที่ต้องไปแสดงผลที่ row</li>
</ul>
<p>เอาละครับ เมื่อเราได้เข้าพื้นฐานของ UITableView ไปบ้างแล้วลำดับต่อไปเราจะมาเขียนโปรแกรมกัน โดยโปรแกรมที่เราจะเขียนกันในวันนี้ คือโปรแกรมเก็บรายชื่อนักเรียนอย่างง่ายๆกัน โดยหน้าตาโปรแกรมจะเป็นดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/program_table.png" rel="lightbox[870]"><img class="size-medium wp-image-878 aligncenter" title="program_table" src="http://www.macfeteria.com/wp-content/uploads/2009/04/program_table-156x300.png" alt="program_table" width="156" height="300" /></a></p>
<p style="text-align: left;">อธิบายโปรแกรมกันก่อนว่าโปรแกรมเราทำอะไร คือโปรแกรมเราจะมี text field เอาไว้ใส่ชื่อนักเรียน หลังจากนั้นเมื่อเรากด Add รายชื่อนักเรียนก็จะไปปรากฎบนตารางของเรา และสามารถลบได้โดยการกด ไปที่แถวที่ต้องการลบ และกด remove</p>
<h2>Start</h2>
<p>ก่อนอื่นเลยเราก็สร้างโปรเจคแบบ Viewed-Base Application เหมือนๆที่เราเคยทำมาครับ โดยจะตั้งชื่ออะไรก็แล้วแต่ แต่ในโปรเจคนี้ผมตั้งชื่อว่า Student ก็แล้วกัน ก็จะได้โปรเจคหน้าตาแบบในรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/project.png" rel="lightbox[870]"><img class="size-medium wp-image-880 aligncenter" title="project" src="http://www.macfeteria.com/wp-content/uploads/2009/04/project-300x214.png" alt="project" width="300" height="214" /></a></p>
<p>หลังจากนั้นเราจะออกแบบหน้าตาโปรแกรมของเรา โดยเปิด StudentViewController.xib ขึ้นมาครับ แล้วเราก็วาง Control ต่างๆลงไป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/uitable.png" rel="lightbox[870]"><img class="size-medium wp-image-881 aligncenter" title="uitable" src="http://www.macfeteria.com/wp-content/uploads/2009/04/uitable-191x300.png" alt="uitable" width="191" height="300" /></a></p>
<p>จากรูปข้างบน เราได้วาง UITable , UIButton , UITextField เพียงเท่านี้ก็เป็นอันเสร็จการออกแบบ อาจจะงงว่า ทำไมไม่เอา Add , Remove ลงมาอยู่ข้างล่างตาราง เหตุผลก็เพราะว่า เมื่อ Keyboard มันโผล่ขึ้นมา มันจะบัง UITextFields ที่เราได้วางลงไป ผมเลยย้ายมันขึ้นมาไว้ข้างบน</p>
<h2>Code</h2>
<p style="text-align: left;">ก่อนอื่นเลยมาดูในส่วนของ Header กันก่อนว่า เราจะประกาศอะไรบ้าง</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> StudentViewController <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	IBOutlet UITextField <span style="color: #002200;">*</span>m_textField;
	IBOutlet UITableView <span style="color: #002200;">*</span>m_table;
&nbsp;
	<span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>m_studentList;
&nbsp;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>m_studentList;
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> delStudent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> addStudent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction <span style="color: #002200;">&#41;</span> endEdit<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p style="text-align: left;">ดูจาก code แล้วเราได้ประกาศ outlet มาด้วยกันแค่ 2 ตัวนั่นก็คือ m_textField และ m_table เพื่อที่เราจะได้ติดต่อ UITextFieds และ UITableView ได้ สำหรับในส่วนของ UIButton นั้นเราไม่ได้ต้องการให้มันทำอะไรนอกจาก เรียก action ที่เราต้องการ ฉนั้นก็ไม่ต้องประกาศ outlet ก็ได้ และเราก็ได้ประกาศ action อีก 3 อย่าง ได้แก่ delStudent , addStudent , endEdit ก็แปลตรงๆ ตามชื่อเลยว่าแต่ละ action นั้นเราจะให้มันทำอะไร</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> StudentViewController
<span style="color: #a61390;">@synthesize</span> m_studentList;
&nbsp;
<span style="color: #11740a; font-style: italic;">// ******************* Load &amp;amp; Unload ***************************</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	m_studentList <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>m_studentList release<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #11740a; font-style: italic;">// ******************* Button Action *************************************</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> addStudent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>text <span style="color: #002200;">=</span> m_textField.text;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span>text isNotEqualTo<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
	  <span style="color: #002200;">&#91;</span>m_studentList addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithString<span style="color: #002200;">:</span>text<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#93;</span>;
	  <span style="color: #002200;">&#91;</span>m_table reloadData<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> delStudent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span>indexPath <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_table indexPathForSelectedRow<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> indexPath <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		<span style="color: #a61390;">int</span> row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>m_studentList removeObjectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>m_table reloadData<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">&#125;</span>
<span style="color: #11740a; font-style: italic;">// ******************* Text Field Action ********************************</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction <span style="color: #002200;">&#41;</span> endEdit<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>sender resignFirstResponder<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #11740a; font-style: italic;">// *************** UITableView Delegate ********************************</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
   numberOfRowsInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> section
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>self.m_studentList count<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView
   cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath;
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>identifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria Cell&quot;</span>;
	UITableViewCell <span style="color: #002200;">*</span>cell;
	cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>identifier<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectZero
			reuseIdentifier<span style="color: #002200;">:</span> identifier<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
	cell.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_studentList objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p style="text-align: left;">จาก code ข้างบนผมแบ่งออกเป็น 4 ส่วน นั่นก็ส่วนของ</p>
<ul>
<li>Load &amp; Unload</li>
<li>Button Action</li>
<li>Text Field Action</li>
<li>UITableView Delegate</li>
</ul>
<p>เราจะดูในทีละส่วนก่อนเลยละกัน เริ่มจาก Load &amp; Unload ก่อนละกัน</p>
<h3>Load &amp; Unload</h3>
<p>ในส่วน code ตรงนี้ จะเห็นว่ามี viewDidLoad ซึ่งจริงๆแล้ว viewDidLoad เป็น delegate method ของ UIView ครับ นั่นแปลว่า เมื่อ UIView ของเราถูกโหลดขึ้นมาเสร็จเรียบร้อยแล้ว ก็จะมาถามว่า มีอะไรที่ต้องอีกหรือเปล่า ? ซึ่งก็จะมาอ่าน code ในนี้เหละครับว่า โหลดเสร็จแล้วต้องทำอะไร ถ้าเราดูใน code ภายในก็จะเห็นว่าเราได้บอกว่า หลังจากโหลด UIView นี้ก็ให้จองหน่วยความจำและ init ให้กับ array ของเรานั่นก็คือ m_studentList นั่นเอง และส่วนฟังก์ชั่น dealloc จะถูกเรียกเมื่อโปรแกรมได้จบลง ซึ่งเราก็ได้คืนหน่วยความจำที่เราได้ให้ m_studentList จองไว้นั่นเอง</p>
<h3>Button Action</h3>
<p>action method ในส่วนตรงนี้เราได้เขียน addStudent เพื่อที่ว่า เราจะนำข้อความจาก text field มาใส่ยัง array ของเรานั่นเอง และส่วน delStudent นั้นก็คือเราจะทำการลบข้อมูลที่ได้เลือกไว้ ออกจากตาราง อธิบายเพิ่มเติมในส่วนของ code นิดหนึ่งครับ วิธีการที่เราจะรู้ว่าแถวในตารางไหนจะถูกเลือก จะเห็นว่าเราได้เรียก</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"> <span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span>indexPath <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_table indexPathForSelectedRow<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>แต่ indexPath จะยังใช้โดยตรงไม่ได้ เราต้องเรียก [indexPath row] อีกทีเพื่อที่จะได้ตำแหน่งของแถวในตาราง และเมื่อเราได้ลบออกไปแล้ว เราก็ให้ตารางได้ reload เพื่อปรับข้อมูลในการแสดงผล</p>
<h3>Text Field Action</h3>
<p>ในส่วนของ action สำหรับ text field นั้นจริงๆก็ไม่ได้มีอะไรเลยครับ เราแค่ต้องการให้ เมื่อเราได้พิมพ์ข้อความ และหลังจากกด done เรียบร้อยแล้ว ก็จะให้ keyboard นั้นหายไป วิธีการก็คือเราก็ให้ text field ได้ถอนตัวจากการเป็น first responder นั่นเอง</p>
<h3>UITableView Delegate</h3>
<p style="text-align: left;">ก็อย่างที่บอกไปครับว่า เมื่อเราจะใช้ UITableView นั้นเราจำเป็นต้อง implement &#8211; delegate ของ UITableView สอง function โดย delegate funciton แรกคือ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableView
   numberOfRowsInSection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> section</pre></div></div>

<p>นั้นเป็นฟังก์ชั่นที่เอาไว้บอกกับ table view ว่ามีจำนวนแถวกี่แถวที่ต้องแสดง และจาก code ที่เราเขียนไป เราก็ได้บอกว่าจำนวนแถวในตารางทั้งหมดของเรา เท่ากับจำนวนของค่าที่เก็บใน m_studentList นั่นเอง</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView
   cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath;</pre></div></div>

<p>สำหรับ delegate method นี้เป็นฟังก์ชั่นที่เอาไว้บอกว่า ข้อมูลที่จะแสดงในแถวของ ตาราง คืออะไร  ** และอย่างที่บอกไปแล้วว่า แถวของตารางนั้นเป็น control ที่เรียกว่า UITableViewCell ** ฉนั้นแล้วเราต้องสร้าง UItableViewCell ขึ้นมาก่อน</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UITableViewCell alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectZero
			reuseIdentifier<span style="color: #002200;">:</span> identifier<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>และจากบรรทัดนี้ จะเห็นว่าเราได้ประกาศ cell ขึ้นมาและได้จองหน่วยความจำให้กับ cell พร้อมกับ init เรียบร้อย อาจจะงงตรง ที่เขียนว่า reuseIndentifier ว่ามันคืออะไร คือ UITalbleViewCell นั้นเป็น Subclass ของ UIView นั่นแปลว่า cell ของเรานั้นอาจจะเป็น ข้อความธรรมดา หรืออาจจะเป็น Custom View หรือแม้กระทั่งเป็น table ทั้งอันก็ยังได้ ฉนั้นการที่ มี indentifier ก็เพื่อระบุว่า cell นี้เป็นประเภทไหน ความสำคัญอีกอย่างก็เพื่อจะได้นำกลับมาใช้ใหม่ซึ่งจะอธิบายในลำดับต่อไป</p>
<p>เมื่อเรามี cell แล้วลำดับต่อไปเราก็จะนำข้อมูลที่ต้องการใส่ไปใน cell และข้อมูลที่เราต้องการในที่นี้ก็คือข้อมูลที่เราได้เก็บไว้ในตัวแปร m_studentList นั่นเอง</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">	NSUInteger row <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>indexPath row<span style="color: #002200;">&#93;</span>;
	cell.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_studentList objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> cell;</pre></div></div>

<p>ยังมี code ส่วนที่เหลือนั่นก็คือ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">	<span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>identifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Macfeteria Cell&quot;</span>;
	UITableViewCell <span style="color: #002200;">*</span>cell;
	cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>identifier<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>อธิบายเพิ่มเติมนะครับว่า เมื่อเราได้ใช้นิ้วเลื่อนดูค่าในตำแหน่งอื่นๆของตาราง Cell ที่ได้ถูกเลื่อนไปจนไม่สามารถจะแสดงผลที่หน้าจอได้ ตามหลักการทำงานของโปรแกรมแล้ว มันควรจะคืนหน่วยความจำของ Cell นั้นให้กับระบบ แล้วก็จองหน่วยความจำใหม่ ให้กับ Cell ที่จะมาแทนที่ Cell เดิมที่ได้หายไปจากหน้าจอ แต่เนื่องจากว่า iPhone นั้นค่อนข้างจะจำกัดทรัพยากรของระบบ วิศวกรของ Apple เลยออกแบบให้ Cell ที่ได้หายไปจากหน้าจอจะยังไม่ถูกทำลาย แต่จะถูกเก็บไว้ยัง dequeue เพื่อที่ว่าจะได้นำกลับมาใช้ใหม่ ซึ่งจะช่วยลดการจองและคืนหน่วยความจำให้กับระบบบ่อยๆ  ดังนั้นการใช้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">	cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>identifier<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>ก็เพื่อเพิ่มประสิทธิภาพการใช้งานหน่วยความจำให้กับระบบนั่นเอง สรุปก็คือ ก่อนที่มันจะจองหน่วยความจำใหม่ มันจะไปถาม table ก่อนว่ามี cell ไหนที่สามารถนำกลับมาใช้ได้บ้างหรือเปล่า ถ้ามี ก็ไม่ต้องจองใหม่ แต่ถ้าไม่มี ก็จองหน่วยความจำใหม่นั่นเอง</p>
<h2>Link Control</h2>
<p>ลำดับต่อไปเราก็จะ link control ต่างๆให้เข้ากับ action ของเราครับ โดยกลับไปที่ interface builder แล้วก็ เชื่อม</p>
<ul>
<li>m_table กับ UITableView</li>
<li>m_textField กับ UITextField</li>
</ul>
<p>ผมคิดว่าใน tutorial นี้คงไม่ต้อง อธิบายเยอะนะครับว่า เราจะเชื่อม Control และ Action ยังไง ขออธิบายคร่าวๆเลยนะครับ แล้วก็ link action ให้กับ Button ของเรา รวมถึง action ของ m_textField ด้วย</p>
<p>มีส่วนเพิ่มเติมก็คือใน connection inspector ของ UITableView นั้นจะเห็น Delegate และ Data Source ดังรูปครับ ให้ลากเชื่อมเข้ากับ File&#8217;s Owner ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/datasource.png" rel="lightbox[870]"><img class="size-medium wp-image-900 aligncenter" title="datasource" src="http://www.macfeteria.com/wp-content/uploads/2009/04/datasource-300x237.png" alt="datasource" width="300" height="237" /></a></p>
<p>ที่เราทำตรงนี้ก็เพื่อว่าจะได้บอกให้ table ของเราได้รู้ว่า object ไหนเป็น helper object และ datasource นั่นเอง<br />
ส่วน Action  อื่นๆ เช่น delStudent ก็ลากเข้ากับปุ่ม ให้เรียบร้อย และรวมถึง endEdit ที่ต้องเชื่อมกับ text filed ด้วยนะครับ ถ้าหากเสร็จหมดแล้ว ถ้า click ขวาที่ File&#8217;s Owner ก็จะเห็น panel พร้อมกับค่าต่างๆดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/completed.png" rel="lightbox[870]"><img class="size-medium wp-image-901 aligncenter" title="completed" src="http://www.macfeteria.com/wp-content/uploads/2009/04/completed-300x200.png" alt="completed" width="300" height="200" /></a></p>
<p>หลังจากก็ลอง Compile &amp; Run ดูครับ เราก็จะสามารถ พิมพ์ข้อความและกด Add เพื่อให้ข้อความนั้นเข้ามายัง table ของเราได้แล้ว</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/add_row.png" rel="lightbox[870]"><img class="size-medium wp-image-902 aligncenter" title="add_row" src="http://www.macfeteria.com/wp-content/uploads/2009/04/add_row-156x300.png" alt="add_row" width="156" height="300" /></a></p>
<p>และแน่นอนว่า เราสามารถลบข้อมูลได้ด้วยการเลือกไปยังแถวที่ต้องการและกด remove ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/remove_row.png" rel="lightbox[870]"><img class="size-medium wp-image-903 aligncenter" title="remove_row" src="http://www.macfeteria.com/wp-content/uploads/2009/04/remove_row-156x300.png" alt="remove_row" width="156" height="300" /></a></p>
<p>เป็นอย่างไรบ้างครับสำหรับ tutorial นี้คงได้ไปลองๆหัดทำกัน และได้เข้าใจเกี่ยวกับ delegate พร้อมกับ UITableView กันนะครับ ยินดีรับคำแนะนำ และติชมนะครับ</p>
<p><a href="http://www.macfeteria.com/wp-content/uploads/2009/04/iphone_student.zip">Download Source :: iPhone &#8211; Student List With UITable<br />
</a></p>

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/cocoa+touch' rel='tag' target='_self'>cocoa touch</a>, <a class='technorati-link' href='http://technorati.com/tag/iphone' rel='tag' target='_self'>iphone</a>, <a class='technorati-link' href='http://technorati.com/tag/programming' rel='tag' target='_self'>programming</a>, <a class='technorati-link' href='http://technorati.com/tag/UITableView' rel='tag' target='_self'>UITableView</a>, <a class='technorati-link' href='http://technorati.com/tag/UITableViewCell' rel='tag' target='_self'>UITableViewCell</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/04/09/iphone-programming-iv-table-view-path-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>iPhone Programming III : More GUI</title>
		<link>http://www.macfeteria.com/blog/2009/03/13/iphone-programming-iii-more-gui/</link>
		<comments>http://www.macfeteria.com/blog/2009/03/13/iphone-programming-iii-more-gui/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 10:46:28 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=762</guid>
		<description><![CDATA[หลังจากที่ได้ลองเล่นกับ action และ event ต่างๆพอสมควร วันนี้เดี๋ยวมาลองการใช้งาน Control ตัวอื่นกันดูบ้าง สำหรับวันนี้ Control ที่เราจะได้ลองกันได้แก่ UIImageView UITextField UISwitch UISlider UIActionSheet UIAlertView หน้าตาโปรแกรมที่เราจะได้ลองทำก็ออกมาประมาณนี้ อธิบายกันก่อนว่าโปรแกรมเราทำอะไร โปรแกรมที่เราจะทำก็คือ เราจะทดลองเล่นกับ UIImageView โดยเราสามารถ กด on/off เพื่อแสดงรูปหรือไม่แสดง และสามารถปรับค่า alpha (ค่าความโปร่งแสง) ของรูปจาก slider อีกทั้งเราจะได้ทดลองใช้ UIActionSheet และ UIAlertView Let&#8217;s Go ก่อนอื่นเราก็สร้างโปรเจคขึ้นมาครับ ให้ชื่อว่าอะไรก็ตามใจเลยครับ หลังจากนั้น เราก็ลาก Image View , Slider ,Switch , Label เข้ามาดังรูป จาก interface ที่เราได้ออกแบบไว้ จะเห็นว่า ผมได้นำ image [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจากที่ได้ลองเล่นกับ action และ event ต่างๆพอสมควร วันนี้เดี๋ยวมาลองการใช้งาน Control ตัวอื่นกันดูบ้าง สำหรับวันนี้ Control ที่เราจะได้ลองกันได้แก่</p>
<ul>
<li>UIImageView</li>
<li>UITextField</li>
<li>UISwitch</li>
<li>UISlider</li>
<li>UIActionSheet</li>
<li>UIAlertView</li>
</ul>
<p>หน้าตาโปรแกรมที่เราจะได้ลองทำก็ออกมาประมาณนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/interface1.png" rel="lightbox[762]"><img class="size-medium wp-image-763 aligncenter" title="interface1" src="http://www.macfeteria.com/wp-content/uploads/2009/03/interface1-191x300.png" alt="interface1" width="191" height="300" /></a></p>
<p style="text-align: left;">อธิบายกันก่อนว่าโปรแกรมเราทำอะไร</p>
<p style="text-align: left;">โปรแกรมที่เราจะทำก็คือ เราจะทดลองเล่นกับ UIImageView โดยเราสามารถ กด on/off เพื่อแสดงรูปหรือไม่แสดง และสามารถปรับค่า alpha (ค่าความโปร่งแสง) ของรูปจาก slider อีกทั้งเราจะได้ทดลองใช้ UIActionSheet และ UIAlertView</p>
<h2 style="text-align: left;">Let&#8217;s Go</h2>
<p style="text-align: left;">ก่อนอื่นเราก็สร้างโปรเจคขึ้นมาครับ ให้ชื่อว่าอะไรก็ตามใจเลยครับ หลังจากนั้น เราก็ลาก Image View , Slider ,Switch , Label เข้ามาดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/first_interface.png" rel="lightbox[762]"><img class="size-medium wp-image-767 aligncenter" title="first_interface" src="http://www.macfeteria.com/wp-content/uploads/2009/03/first_interface-191x300.png" alt="first_interface" width="191" height="300" /></a></p>
<p style="text-align: left;">จาก interface ที่เราได้ออกแบบไว้ จะเห็นว่า ผมได้นำ image view วางไว้ตำแหน่งเดียวกัน กับ Label ( Macfeteria ) เลย คือที่ทำอย่างนี้ก็เพื่อว่าอยากจะให้เห็นว่า เมื่อเราปรับค่า Alpha ของรูปแล้ว มันจะโปร่ง และถ้ารูปยิ่งโปร่งมากก็จะเห็นคำว่า Macfeteria มากขึ้น แล้วเราก็ลอง Compile/Run ดูครับ จะเห็นหน้าตาประมาณนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/testimage.png" rel="lightbox[762]"><img class="size-medium wp-image-773 aligncenter" title="testimage" src="http://www.macfeteria.com/wp-content/uploads/2009/03/testimage-156x300.png" alt="testimage" width="156" height="300" /></a></p>
<p style="text-align: center;">
<p style="text-align: left;">จะเห็นว่า UIImageView นั้นได้หายไป ก็เพราะว่าเรายังไม่ได้ใส่รูปให้มันนั่นเอง</p>
<p style="text-align: left;">ต่อไปเราจะเพิ่มรูปเข้าไปยัง โปรเจคของเราเพื่อนำมาใช้กับ image view วิธีการก็ไม่ยาก เราก็ Click ขวาไปที่ Resource แล้วก็เลือก Add &gt; Existing Files &#8230; แล้วก็เลือกไฟล์รูปที่ต้องการ เมื่อเสร็จแล้วจะเห็นว่า ไฟล์ที่เราได้เลือกไป ได้เข้ามาอยู่ใน Resource เรียบร้อยแล้ว</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/addimage.png" rel="lightbox[762]"><img class="size-medium wp-image-769 aligncenter" title="addimage" src="http://www.macfeteria.com/wp-content/uploads/2009/03/addimage-300x195.png" alt="addimage" width="300" height="195" /></a></p>
<p style="text-align: left;">กลับไปยัง Interface builder แล้วก็เลือกที่ UIImageView แล้วก็เปิด Inspector ขึ้นมา จะเห็นว่ามี Attribute ต่างๆให้ปรับ อธิบายทีละอย่างแล้วกัน</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/uiimageview.png" rel="lightbox[762]"><img class="size-medium wp-image-770 aligncenter" title="uiimageview" src="http://www.macfeteria.com/wp-content/uploads/2009/03/uiimageview-300x157.png" alt="uiimageview" width="300" height="157" /></a></p>
<ul>
<li>Image เป็นชื่อ file  ที่เราจะต้องการจะแสดงที่ imageview นี้</li>
<li>Mode การจัดการเกี่ยวกับภาพเป็นต้นว่า ปรับให้พอดีกับขนาด imageview , กำหนดให้ภาพอยู่ตรงกลางของ imageview เป็นต้น</li>
<li>Alpha ความโปร่งใส ถ้าไม่โปร่งเลยคือ 1.0 ถ้ายิ่งเลขน้อยก็จะยิ่งโปร่งใส</li>
<li>Tag เป็นค่าคงที่ของ object นี้ ( เดี๋ยวจะได้ใช้ในครั้งหน้า )</li>
<li>Drawing
<ul>
<li>Opaque บอกให้ uiimageview ไม่ต้องวาด object ที่อยู่ข้างหลัง ( ควรจะใช้ เพราะมันเพิ่มประสิทธิภาพ )</li>
<li>Hidden ก็แปลตรงเลยครับว่า จะให้มันซ่อน หรือแสดง</li>
<li>Clip Subviews จะทำการตัดขอบให้ไม่เกินขนาดของ view</li>
</ul>
</li>
<li>Interaction
<ul>
<li>User Interaction Enabled ถ้าเปิด option นี้ก็จะทำให้ object  นี้สามารถตอบสนองต่อ event ต่างๆได้</li>
<li>Multiple Touch ก็เปิดให้ใช้งาน multiple touch ได้นั่นเอง</li>
</ul>
</li>
</ul>
<p>เมื่อเราได้ใส่รูปภาพเข้าไปแล้ว ถ้าลอง complie / run ก็จะเห็นรูปปรากฏยัง uiimageview ของเราเรียบร้อยแล้ว</p>
<h2>Implement Controller Class</h2>
<p>เมื่อเราได้ออกแบบหน้าตาของโปรแกรมเราเรียบร้อยไปแล้วส่วนหนึ่ง ต่อไปก็คือ การเขียน code นั่นเอง กลับไปที่ xcode และเริ่มเปิด controller class ของเรา หลังจากนั้นก็เขียน code ในส่วนของ interface ตามนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> GUIViewController <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	IBOutlet UIImageView <span style="color: #002200;">*</span>m_imageView;
	IBOutlet UISlider <span style="color: #002200;">*</span>m_slider;
	IBOutlet UISwitch <span style="color: #002200;">*</span>m_switch;
	IBOutlet UITextField <span style="color: #002200;">*</span>m_textField;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span> UIImageView<span style="color: #002200;">*</span> m_imageView;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span> UISlider<span style="color: #002200;">*</span> m_slider;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span> UISwitch<span style="color: #002200;">*</span> m_switch;
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> adjustAlpha<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> imageVisible<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>และส่วน implement ก็เป็นแบบนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> GUIViewController</pre></div></div>

<p>aa</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> GUIViewController
<span style="color: #a61390;">@synthesize</span> m_imageView;
<span style="color: #a61390;">@synthesize</span> m_slider;
<span style="color: #a61390;">@synthesize</span> m_switch;
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> adjustAlpha<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">float</span> value <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_slider value<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_imageView setAlpha<span style="color: #002200;">:</span>value<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> imageVisible<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span>m_switch isOn<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #a61390;">YES</span> <span style="color: #002200;">&#41;</span>
		<span style="color: #002200;">&#91;</span>m_imageView setHidden<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">else</span>
		<span style="color: #002200;">&#91;</span>m_imageView setHidden<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จาก code ข้างบน function ที่ชื่อ adjustAlpha เราจะไป link เข้ากับ slider เพื่อที่ว่า เมื่อเราเลื่อน slider ค่าของ alpha ก็จะเปลี่ยนไป และเราก็มี imageVisible ที่คอยเปิดปิด imageView ของเรา คิดว่าไม่น่ายากนะครับ</p>
<p>และหลังจากนั้น เราก็จะเชื่อม code ที่เราได้เขียนไปกับ interface ที่เราได้ออกแบบไว้</p>
<p>เราก็ลาก link เชื่อมกับ image view , slider , switch กับ m_imageView , m_slider , m_switch ตามลำดับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/link.png" rel="lightbox[762]"><img class="size-medium wp-image-776 aligncenter" title="link" src="http://www.macfeteria.com/wp-content/uploads/2009/03/link-300x218.png" alt="link" width="300" height="218" /></a></p>
<p>หลังจากเสร็จแล้ว เราก็เชื่อม method ที่ชื่อว่า adjustAlpha เข้ากับ slider และ imageVisible เข้ากับ swich ให้เรียบร้อย  เมื่อเสร็จแล้ว click ขวาที่ File&#8217;s Owner ดูก็จะเห็นว่า object ต่างๆ ได้เชื่อมเข้าด้วยกันเรียบร้อยแล้ว</p>
<p>อย่าลืมปรับค่า max , min ของ slider ด้วยนะครับ เพราะ alpha ของ image มีแค่ 0 &#8211; 1.0 เราก็เปิด inspector ขึ้นมาแล้วก็ปรับ ค่า max ,min ให้เรียบร้อยดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/slider.png" rel="lightbox[762]"><img class="size-medium wp-image-777 aligncenter" title="slider" src="http://www.macfeteria.com/wp-content/uploads/2009/03/slider-246x300.png" alt="slider" width="172" height="210" /></a></p>
<p>เมื่อเสร็จแล้วก็ Compile / Run ดูครับ แล้วลองเลื่อน slider ไปมาดูครับว่า ถ้าเราเลื่อนซ้ายรูปเราได้จางจนมองเห็นคำว่า macfeteria และเมื่อเลื่อนไปด้านขวารูปก็จะชัดขึ้นตามไปด้วยหรือเปล่า</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/programa.png" rel="lightbox[762]"><img class="size-medium wp-image-778 aligncenter" title="programa" src="http://www.macfeteria.com/wp-content/uploads/2009/03/programa-156x300.png" alt="programa" width="156" height="300" /></a></p>
<h2>Action Sheet</h2>
<p>จริงๆแล้ว action sheet ก็คล้ายๆกับ message box นะครับ คือจะเป็น message ขึ้นมาพร้อมกับ ปุ่มให้เราเลือกว่าจะ ok , cancel ประมาณนี้ และเราก็จะได้ลองใช้งานกัน สิ่งต่อไปที่เราจะทำเพิ่มเติมในโปรแกรมของเราก็คือ เราจะมี text field และ button อย่างละอัน โดยเมื่อกดไปที่ปุ่ม ก็จะมีหน้าต่าง action sheet ขึ้นมา ถ้ากด ok ก็จะมี alert ขึ้นมา บอกว่า Hello อะไรประมาณนี้</p>
<p>ก่อนอื่นเราก็ไปเพิ่ม button และ text field ให้กับ interface ของเราดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/interface2.png" rel="lightbox[762]"><img class="size-medium wp-image-781 aligncenter" title="interface2" src="http://www.macfeteria.com/wp-content/uploads/2009/03/interface2-191x300.png" alt="interface2" width="191" height="300" /></a></p>
<p>เมื่อเราได้วาง text field ลงไปยัง interface ของเราแล้วต่อไปเราจะมาทำความรู้จัก attribute ต่างๆของ text fields เพิ่มเติมกันอีกสักนิดว่ามีอะไรบ้าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/textfield.png" rel="lightbox[762]"><img class="size-medium wp-image-782 aligncenter" title="textfield" src="http://www.macfeteria.com/wp-content/uploads/2009/03/textfield-153x299.png" alt="textfield" width="153" height="299" /></a></p>
<ul>
<li>Text Field
<ul>
<li>PlaceHolder คือข้อความลางๆ ( สีเทาๆ ) เวลาที่ไม่มีอะไรอยู่ใน text field เลย</li>
<li>Clear When Editing Begins จะลบข้อความเก่า ทุกครั้งที่แก้ไข text field</li>
<li>Adjust To Fit ปรับขนาดตัวหนังสือให้พอดี แต่ไม่ตำ่ว่า ขนาดที่เรากำหนด</li>
</ul>
</li>
<li>Text Input Traits
<ul>
<li>Capitalize เลือกว่าจะให้ตัวหนังสือเป็นตัวพิมพ์ใหญ่ หรือพิมพ์เล็ก โดยอาจจะแบ่งเป็นคำๆ หรือประโยค</li>
<li>Correction โปรแกรมจะตรวจความถูกต้องให้ด้วยว่า พิมพ์ถูกหรือไม่</li>
<li>Type แป้นพิมพ์เป็นแบบไหน ( ตัวหนังสือ , ตัวเลข , url ,เบอร์โทร )</li>
<li>Appearance ( Default , Alert ) ถ้าปรับเป็น alert แป้นพิมพ์จะโปร่งใสนิดๆ</li>
<li>Return Key ( Go , Done , etc ) ตรงนี้เราปรับ return key ให้ กับ keyboard อย่างตัวอย่างรูปข้างล่าง ผมปรับให้เป็น Yahoo!<br />
<a href="http://www.macfeteria.com/wp-content/uploads/2009/03/yahoo.png" rel="lightbox[762]"><img class="size-medium wp-image-784 aligncenter" title="yahoo" src="http://www.macfeteria.com/wp-content/uploads/2009/03/yahoo-300x201.png" alt="yahoo" width="180" height="121" /></a></li>
</ul>
</li>
</ul>
<p>ต่อไปก็คือเราจะเพิ่ม outlet เข้าไปยัง controller class ของเรา</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Outlet</span>
IBOutlet UITextField <span style="color: #002200;">*</span>m_textField;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Action</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> saySomeThing<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> endEdit<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;</pre></div></div>

<p>และในส่วน implement endEdit ก็มีดังนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction <span style="color: #002200;">&#41;</span> endEdit<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>sender resignFirstResponder<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>จาก code ข้างบน [sender resignFirtResponder] เราจะนำไป link เข้ากับ text field ของเราเพื่อที่ว่า เมื่อ user พิมพ์ข้อความเข้าไปยัง text field แล้ว เมื่อกด return ก็ให้เปลี่ยน first responder ไปยัง object อื่น เพราะถ้าหาก เราไม่ resign firstponder แล้วละก้อ แป้น keyboard ก็จะค้างอยู่แบบนั้น</p>
<p>เสร็จแล้วเราก็ link เข้ากับ event ที่ชื่อว่า Did End On Exit</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/endedit.png" rel="lightbox[762]"><img class="size-medium wp-image-807 aligncenter" title="endedit" src="http://www.macfeteria.com/wp-content/uploads/2009/03/endedit-249x300.png" alt="endedit" width="249" height="300" /></a></p>
<p>และส่วน source code ของ saySomeThing ก็ได้ประมาณนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Outlet</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> saySomeThing<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	UIActionSheet <span style="color: #002200;">*</span>actionSheet <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIActionSheet alloc<span style="color: #002200;">&#93;</span>
			initWithTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;คนไทยหรือเปล่า ?&quot;</span>
			delegate<span style="color: #002200;">:</span>self
			cancelButtonTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ไม่อ่ะ&quot;</span>
			destructiveButtonTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;เป็นสิครับ&quot;</span>
			otherButtonTitles<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>actionSheet showInView<span style="color: #002200;">:</span>self.view<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>actionSheet release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>จาก code ข้างบนจะอธิบาย คร่าวๆก็คือ เราได้ประกาศ Action Sheet ขึ้นมาและกำหนดค่าต่างๆให้กับ sheet เป็นต้นว่า ข้อความต่างๆ <span style="text-decoration: underline;">และส่วนที่สำคัญมากคือ delegate:selft</span></p>
<p>*** ยังจำ delegate ได้ไหมครับ ? ****<br />
สรุปง่ายๆว่า delegate:self เนี่ย เราได้กำหนดให้คลาสที่จะตอบสนองต่อ delegate method ของ action sheet นี้คือ คนที่สร้างตัวมันเอง ( ในกรณีนี้คือ GUIViewController ) และ delegate method ของ action sheet นี้ก็เช่นว่า  เมื่อกด ok ให้ไปทำอะไร เมื่อกด cancel ให้ไปทำอะไร</p>
<p>แล้วเราก็ link ให้เข้ากับ button ของเรา</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/saysome.png" rel="lightbox[762]"><img class="size-medium wp-image-806 aligncenter" title="saysome" src="http://www.macfeteria.com/wp-content/uploads/2009/03/saysome-212x300.png" alt="saysome" width="212" height="300" /></a></p>
<p>เราลอง compile / run แล้วกด Say Something ! ดูครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/action.png" rel="lightbox[762]"><img class="size-medium wp-image-789 aligncenter" title="action" src="http://www.macfeteria.com/wp-content/uploads/2009/03/action-156x300.png" alt="action" width="156" height="300" /></a></p>
<p>กดแล้วก็ยังไม่เห็นว่ามีอะไรเกิดขึ้น ต่อไปเราจะ implement ส่วนของ delegate ของ action sheet กัน</p>
<h2>Delegate</h2>
<p>action sheet มี delegate method ต่างๆ ดังนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Called when a button is clicked. The view will be</span>
<span style="color: #11740a; font-style: italic;">// automatically dismissed after this call returns</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>actionSheet<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIActionSheet <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>actionSheet
			clickedButtonAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>buttonIndex;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Called when we cancel a view (eg. the user clicks the Home button).</span>
<span style="color: #11740a; font-style: italic;">// This is not called when the user clicks the cancel button.</span>
<span style="color: #11740a; font-style: italic;">// If not defined in the delegate, we simulate a click in the cancel button</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>actionSheetCancel<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIActionSheet <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>actionSheet;
&nbsp;
<span style="color: #11740a; font-style: italic;">// before animation and showing view</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>willPresentActionSheet<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIActionSheet <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>actionSheet;
&nbsp;
<span style="color: #11740a; font-style: italic;">// after animation</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>didPresentActionSheet<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIActionSheet <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>actionSheet;  
&nbsp;
<span style="color: #11740a; font-style: italic;">// before animation and hiding view</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>actionSheet<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIActionSheet <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>actionSheet
			willDismissWithButtonIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>buttonIndex;
<span style="color: #11740a; font-style: italic;">// after animation</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>actionSheet<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIActionSheet <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>actionSheet
			didDismissWithButtonIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>buttonIndex;</pre></div></div>

<p>ผมเลือกใช้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>actionSheet<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIActionSheet <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>actionSheet
			clickedButtonAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>buttonIndex;</pre></div></div>

<p>ก็แล้วกันนะครับ และเราก็จะมา implement delegate ตัวนี้กัน โดย code มีดังนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>actionSheet<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIActionSheet <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>actionSheet
				clickedButtonAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>buttonIndex
<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>text
	text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;สวัสดีครับคุณ%@&quot;</span>,<span style="color: #002200;">&#91;</span>m_textField text<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> buttonIndex <span style="color: #002200;">==</span> <span style="color: #002200;">&#91;</span>actionSheet destructiveButtonIndex<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		UIAlertView <span style="color: #002200;">*</span>alert;
		alert <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIAlertView alloc<span style="color: #002200;">&#93;</span> initWithTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ยินดีนะจ๊ะ&quot;</span>
		message<span style="color: #002200;">:</span>text delegate<span style="color: #002200;">:</span>self cancelButtonTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ตกลง&quot;</span>
		otherButtonTitles<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
		<span style="color: #002200;">&#91;</span>alert show<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>alert release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>จาก code ข้างบน ก็คือ ถ้าหาก user กดปุ่ม action sheet เป็นปุ่ม destructive ก็ให้ Alert ขึ้นมา บอกว่า &#8220;สวัสดีครับคุณ&#8221; พร้อมกับข้อความใน text field ที่ user ได้พิมพ์ลงไป<br />
ลอง compile / run ดูครับ</p>
<p>เมื่อกด Say Something ! ก็จะเห็น action sheet ขึ้นมา ถ้าหากกด &#8220;เป็นสิครับ&#8221; ก็จะเห็น Alert ขึ้นมาบอกว่า &#8220;สวัสดีครับคุณ ปานวาด&#8221; ทำนองนี้ ดังเช่นรูปข้างล่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/panvad.png" rel="lightbox[762]"><img class="size-medium wp-image-804 aligncenter" title="panvad" src="http://www.macfeteria.com/wp-content/uploads/2009/03/panvad-156x300.png" alt="panvad" width="156" height="300" /></a></p>
<p>เป็นไง บ้างครับ สำหรับวันนี้ ได้ลองใช้งาน UI หลายตัวมากๆ มี คอมเม้น ตำชม แนะนำกันได้ครับ</p>
<p><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/testgui.zip">Download Source</a></p>

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/cocoa+touch' rel='tag' target='_self'>cocoa touch</a>, <a class='technorati-link' href='http://technorati.com/tag/iphone' rel='tag' target='_self'>iphone</a>, <a class='technorati-link' href='http://technorati.com/tag/programming' rel='tag' target='_self'>programming</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/03/13/iphone-programming-iii-more-gui/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>iPhone Programming : II &#8211; Event &amp; Action</title>
		<link>http://www.macfeteria.com/blog/2009/03/11/iphone-programming-ii-event-action/</link>
		<comments>http://www.macfeteria.com/blog/2009/03/11/iphone-programming-ii-event-action/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 12:06:38 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=706</guid>
		<description><![CDATA[สำหรับวันนี้เราจะมาต่อกันด้วยเรื่องของ action และ event กัน ก็หลังจากที่ได้รู้เกี่ยวกับ iphone SDK ไปอย่างคร่าวๆแล้ว และก็ได้เข้าใจ Cocoa ในเบื้องต้นมาบ้างแล้ว วันนี้เราจะมาทำความเข้าใจเกี่ยวกับ Event ต่างๆของ iPhone ด้วยการเขียนโปรแกรมอย่างง่ายๆกันดู อย่างที่บอกไปครับว่าหลังจากที่เราได้มั่วๆเขียน iPhone  กันไปตั้งแต่แรกๆ ดังในตัวอย่าง http://www.macfeteria.com/2008/09/iphone-programming-begin หลายคนอาจจะทำตามโดยที่ไม่รู้อะไรเลย เอาเป็นว่าวันนี้ผมจะอธิบายให้เข้าใจเบื้องต้นก่อนแล้วกัน โดยปกติแล้วการเขียนโปรแกรมด้วย Cocoa นั้น นอกจากเราจะเขียน Class และประกาศ member , variable , method ต่างๆแล้ว ยังมีส่วนสำคัญอยู่อีก สองอย่างคือ IBOutlet IBOutlet เป็นการประกาศให้ IB ( interface builder ) รับรู้ว่า ตัวแปรนี้ สามารถเชื่อมต่อเข้ากับ Object ใน nib , xib ได้  พูดอีกในทางหนึ่งได้ว่า IBOutlet [...]]]></description>
			<content:encoded><![CDATA[<p>สำหรับวันนี้เราจะมาต่อกันด้วยเรื่องของ action และ event กัน ก็หลังจากที่ได้รู้เกี่ยวกับ iphone SDK ไปอย่างคร่าวๆแล้ว และก็ได้เข้าใจ Cocoa ในเบื้องต้นมาบ้างแล้ว วันนี้เราจะมาทำความเข้าใจเกี่ยวกับ Event ต่างๆของ iPhone ด้วยการเขียนโปรแกรมอย่างง่ายๆกันดู</p>
<p>อย่างที่บอกไปครับว่าหลังจากที่เราได้มั่วๆเขียน iPhone  กันไปตั้งแต่แรกๆ ดังในตัวอย่าง http://www.macfeteria.com/2008/09/iphone-programming-begin หลายคนอาจจะทำตามโดยที่ไม่รู้อะไรเลย เอาเป็นว่าวันนี้ผมจะอธิบายให้เข้าใจเบื้องต้นก่อนแล้วกัน โดยปกติแล้วการเขียนโปรแกรมด้วย Cocoa นั้น นอกจากเราจะเขียน Class และประกาศ member , variable , method ต่างๆแล้ว ยังมีส่วนสำคัญอยู่อีก สองอย่างคือ</p>
<h2>IBOutlet</h2>
<p>IBOutlet เป็นการประกาศให้ IB ( interface builder ) รับรู้ว่า ตัวแปรนี้ สามารถเชื่อมต่อเข้ากับ Object ใน nib , xib ได้  พูดอีกในทางหนึ่งได้ว่า IBOutlet จะเป็นตัวแทนของ Object ที่เราได้ออกแบบใน IB นั่นเอง</p>
<h2>IBAction</h2>
<p style="text-align: left;">เมื่อเราต้องการให้ Control ต่างๆใน interface builder สามารถตอบสนองต่อ action ได้ เราต้องประกาศ method ให้เป็น IBAction ยกตัวอย่างว่า ถ้าเราจะเขียนว่า กดปุ่มแล้วให้ไปเรียกใช้ method นี้ เราต้องประกาศใน method ให้เป็น IBAction โดยปกติแล้ว การประกาศ IBAction จะรับ parameter เป็น idโปรแกรมที่เราจะได้ทดลองเขียนกันวันนี้ไม่มีอะไรมากเลยครับ เป็นโปรแกมทดลองการใช้งาน IBOutlet และ IBAction โดยหน้าตาโปรแกรมเป็นดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/interface.png" rel="lightbox[706]"><img class="size-medium wp-image-727 aligncenter" title="interface" src="http://www.macfeteria.com/wp-content/uploads/2009/03/interface-191x300.png" alt="interface" width="191" height="300" /></a></p>
<p style="text-align: left;">โปรแกรมที่เราจะทำ ก็คือ เมื่อเรากด ปุ่มมันก็จะเปลี่ยน ตัวหนังสือ บนปุ่มให้เป็นเหมือนข้อความใน text field เช่นว่า ถ้าเราพิมพ์ Hello World ถ้ากด Button A มันก็จะเปลี่ยนกลายเป็นคำว่า Hello World ตามไปด้วย ง่ายไม๊ครับ ? ก้ออย่างที่บอกไปว่า เราต้องการจำทำความเข้าใจ เกี่ยวกับ IBAction และ IBOutlet งั้นมาเริ่มเลย</p>
<p>ก่อนอื่นก็เปิด Project ใหม่ขึ้นมา ให้เป็นแบบ View-Base Application จะตั้งชื่อว่าอะไรก็ได้นะครับ อย่างตัวอย่างนี้ผมตั้งว่า ButtonDemo</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/buttondemo.png" rel="lightbox[706]"><img class="size-medium wp-image-728 aligncenter" title="buttondemo" src="http://www.macfeteria.com/wp-content/uploads/2009/03/buttondemo-300x133.png" alt="buttondemo" width="300" height="133" /></a></p>
<p>หลังจากันนั้น เราก็จะออกแบบหน้าตา interface ของเรา โดยเปิดไฟล์ ButtonDemoViewController.xib ขึ้นมา ( ถ้าหากว่าตั้งชื่อ Project เป็นอย่างอื่น ก็จะเห็น .xib ชื่อประมาณว่า xxxxxxxController.xib แทน ) แล้วเราก็วาง Text Field แล้ว Round Rect Button</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/interfacedesign.png" rel="lightbox[706]"><img class="size-medium wp-image-729 aligncenter" title="interfacedesign" src="http://www.macfeteria.com/wp-content/uploads/2009/03/interfacedesign-293x300.png" alt="interfacedesign" width="293" height="300" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">หรือเราอาจจะอยาก ตกแต่ง Button ของเราให้มีสีสันก็ทำได้ โดยที่เราเปิด Inspector ขึ้นมาและ เลือกไปยัง Attributes แล้วเราก็เปลี่ยน สีของตัวหนังสือ ก็ได้นะครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/interfacechangedesign.png" rel="lightbox[706]"><img class="size-medium wp-image-730 aligncenter" title="interfacechangedesign" src="http://www.macfeteria.com/wp-content/uploads/2009/03/interfacechangedesign-279x300.png" alt="interfacechangedesign" width="279" height="300" /></a></p>
<p style="text-align: left;">เมื่อเราได้ออกแบบหน้าตาโปรแกรมเป็นดังที่เราต้องการแล้ว ลำดับต่อไปก็คือ การเขียน Code ก็เริ่มด้วยการเขียน code เพิ่มเข้าไปยัง ButtonDemoViewController.h</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> ButtonDemoViewController <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	IBOutlet UITextField <span style="color: #002200;">*</span>m_textBox;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> printTitle<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ดูจาก Code ข้างบน เราได้ประกาศ IBOutlet ที่เป็น UITextField ขึ้นมา ก็เพื่อว่า เราต้องการที่จะ นำข้อความที่เราพิมพ์ ใน text Field มาแสดงยัง button ของเรา ฉนั้นแล้วเราก็ต้องประกาศ Outlet เพื่อให้ ButtonDemoViewController สามารถใช้งาน UITextFields ที่เราได้ออกแบบใน .xib ได้นั่นเอง</p>
<p>มาถึงตรงนี้ อาจจะสงสัยว่า แล้ว Button อีกทั้งสองอัน ไม่ต้องประกาศ outlet ด้วยหรือ ? คำตอบก็คือไม่ต้องครับ เพราะว่า เราไม่ต้องการใช้ค่าต่างๆของ button หรือปรับเปลี่ยนค่าของ button ต่างกับ text Field ที่เราต้องการ ค่าที่ได้จากการพิ่มพ์เข้ามา เราถึงต้องประกาศให้มี IBOutlet ที่เป็น UITextField สำหรับปุ่มของเรานั้นต้องการคือ เมื่อกดปุ่มแล้วจะให้ทำอะไร ดังนั้นจึงต้องประกาศ action ขึ้นมา นั่นก็คือ เราได้ประกาศ printTitle ขึ้นมาเป็น Action ของการกดปุ่มนี้</p>
<p>หลังจากนั้น เราก็กลับมายัง Interface Builder อีกครั้ง เพื่อทำการเชื่อมต่อ xib ของเราเข้ากับ action และ outlet ที่เราได้ประกาศไว้ โดยเรา</p>
<ul>
<li>Click ขวา ที่ File&#8217;s Owner ของเรา</li>
<li>กดที่ ช่องกลมๆ แล้วลากไป ยัง text field</li>
</ul>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/link_textbox.png" rel="lightbox[706]"><img class="size-medium wp-image-731 aligncenter" title="link_textbox" src="http://www.macfeteria.com/wp-content/uploads/2009/03/link_textbox-300x214.png" alt="link_textbox" width="300" height="214" /></a></p>
<p>สิ่งที่เราได้ทำไป ก็คือ เราได้บอกว่า ให้ m_textBox ของเรา ได้เชื่อมเข้ากับ Text Field ที่เราได้ออกแบบไว้ พูดง่ายๆก็คือว่า เราได้ให้ m_textBox ของเรามีค่าเท่ากับ Text Field ที่เราได้ออกแบบไว้นั่นเอง</p>
<p>เมื่อเราได้เชื่อม text field แล้ว สิ่งต่อไปที่จะต้องทำ ก็คือ เราจะสั่งให้ปุ่ม เมื่อถูกกดแล้วไปทำ Action อะไร วิธีการก็ไม่ยากครับ</p>
<ul>
<li>เลือกปุ่มแล้วกด Ctrl ค้าง</li>
<li>ลากมายัง File&#8217;s Owner แล้วปล่อย mouse<br />
<a href="http://www.macfeteria.com/wp-content/uploads/2009/03/action_link.png" rel="lightbox[706]"><img class="size-medium wp-image-732 aligncenter" title="action_link" src="http://www.macfeteria.com/wp-content/uploads/2009/03/action_link-300x237.png" alt="action_link" width="300" height="237" /></a></li>
<li> หลังจากนั้นเราจะเห็น Panel (กล่องสีดำๆ) ขึ้นมา แล้วก็เลือกไปที่ printTitle<br />
<a href="http://www.macfeteria.com/wp-content/uploads/2009/03/event.png" rel="lightbox[706]"><img class="size-medium wp-image-733 aligncenter" title="event" src="http://www.macfeteria.com/wp-content/uploads/2009/03/event-252x300.png" alt="event" width="252" height="300" /></a></li>
<li>ในส่วนของ Button อีกอันก็ทำแบบเดียวกัน</li>
<li>ถ้ากด Click ขวาที่ File&#8217;s Owner สังเกตตรง Receive Actions จะเห็นดังรูป แสดงว่าทำถูกแล้ว<br />
<a href="http://www.macfeteria.com/wp-content/uploads/2009/03/actionpanel.png" rel="lightbox[706]"><img class="size-medium wp-image-734 aligncenter" title="actionpanel" src="http://www.macfeteria.com/wp-content/uploads/2009/03/actionpanel-278x300.png" alt="actionpanel" width="278" height="300" /></a></li>
</ul>
<p>ต่อไป เราก็จะเขียน code ในส่วนของ action ที่เราได้ประกาศขึ้นมา โดยเปิด  ButtonDemoViewController.m ของเรา แล้วก็เพิ่ม code เข้าไปดังนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> printTitle<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>m_textBox.text <span style="color: #002200;">!=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span>sender setTitle<span style="color: #002200;">:</span>m_textBox.text forState<span style="color: #002200;">:</span>UIControlStateNormal<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>ดูจาก Code ของโปรแกรม อธิบายการทำงานคร่าวๆ ได้ว่า</p>
<ul>
<li>เมื่อปุ่ม ถูกกด มันจะเรียก printTitle พร้อมกับส่ง parameter ที่เป็นบอกว่าใครเป็นคนกด ( sender )</li>
<li>หลังจากนั้นไปเรียกใช้ method ที่ชื่อว่า setTitle: forState:  โดยเราก็นำข้อความ จาก m_textBox และกำหนดให้อยู่ใน state ปกติ</li>
</ul>
<p>ลอง Compile ดูครับ แล้วลองพิมพ์ข้อความ แล้วก็กด ปุ่มดูครับ จะเห็นว่า ปุ่มที่ถูกกด จะถูกเปลี่ยนข้อความบนปุ่ม</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/rundemo.png" rel="lightbox[706]"><img class="size-medium wp-image-735 aligncenter" title="rundemo" src="http://www.macfeteria.com/wp-content/uploads/2009/03/rundemo-156x300.png" alt="rundemo" width="156" height="300" /></a></p>
<h2>Object State</h2>
<p>ถ้าสังเกต ดูดีๆ เวลาที่เรากดปุ่ม B ค้างไว้ จะเห็นว่าข้อความจะเป็น &#8220;Button B&#8221; เมื่อปล่อยแล้วถึงจะเป็น &#8220;Hello World&#8221; ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/rundemo2.png" rel="lightbox[706]"><img class="size-medium wp-image-736 aligncenter" title="rundemo2" src="http://www.macfeteria.com/wp-content/uploads/2009/03/rundemo2-156x300.png" alt="rundemo2" width="156" height="300" /></a></p>
<p>เพราะว่า จาก code ของเราจะเห็นว่าเราได้ setTile: forStete ให้เป็น UIControlStateNormal เมื่อขณะที่ปุ่มได้ถูกกด state ของปุ่มจะเปลี่ยนเป็น UIControlStateHighlighted ถ้าเราเปลี่ยน code จาก UIControlStateNormal ข้างบนให้เป็น UIControlStateHighlighted ก็จะเห็นผลลัพธ์ แบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/state.png" rel="lightbox[706]"><img class="size-medium wp-image-737 aligncenter" title="state" src="http://www.macfeteria.com/wp-content/uploads/2009/03/state-213x300.png" alt="state" width="213" height="300" /></a></p>
<p style="text-align: left;">
<h2 style="text-align: left;">More Event</h2>
<p style="text-align: left;">อย่างที่เราได้ลองกันไป จะเห็นว่า Event สำหรับปุ่มนั้น ที่เราได้ทำไปคือ &#8220;ปุ่มได้ถูกกดลงไป&#8221; เท่านั้นเอง<br />
จริงๆแล้ว UIButton นั้นสามารถรับ event ต่างๆได้มากมาย อาทิเช่นการ Drag เราสามารถกำหนด ให้ event ต่างๆ สามารถเรียกใช้ action ต่างกันก็ได้ ถ้าเราลองกด click ขวา ที่ปุ่มของเราก็จะเห็น Panel ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/touch-up-inside.png" rel="lightbox[706]"><img class="size-medium wp-image-738 aligncenter" title="touch-up-inside" src="http://www.macfeteria.com/wp-content/uploads/2009/03/touch-up-inside-218x300.png" alt="touch-up-inside" width="218" height="300" /></a></p>
<p style="text-align: left;">จะเห็นว่ามี Events ต่างๆมากมาย และจะพบว่า Event ที่ได้เรียก printTitle: นั้นคือ Touch Up Inside คือแปลได้ว่า &#8221; กดปุ่ม และ เมาส์ก็ยังอยู่ในบริเวณปุ่ม &#8221; เราลองกด ปุ่ม Button B แล้วลองเลื่อน mouse ออกนอกปุ่มดูสิครับ จะเห็นว่า ข้อความไม่เปลี่ยน นั่นก็เพราะว่า Event ที่เกิดขึ้นไม่ใช่ Touch Up Inside แต่เป็น Touch Up Outside</p>
<p style="text-align: left;">เราสามารถทดลองการใช้งาน Event อื่นๆได้ เช่นเราเพิ่ม IBAction เข้าไป โดยให้ ชื่อว่า setHelloWorld และมี code แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> setHelloWold<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>sender setTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello Macfeteria&quot;</span> forState<span style="color: #002200;">:</span>UIControlStateNormal<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>แล้วสิ่งที่เราจะทำก็คือ เราจะลองใช้ event ที่ชื่อว่า Touch Drag Exit</p>
<p>การใช้ Event อื่นๆก็ไม่ได้ยากครับ คือ เราก็ลาก mouse ที่จาก Event ที่เราต้องการไปยัง File&#8217;s Owner</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/linkevent.png" rel="lightbox[706]"><img class="size-medium wp-image-739 aligncenter" title="linkevent" src="http://www.macfeteria.com/wp-content/uploads/2009/03/linkevent-300x215.png" alt="linkevent" width="300" height="215" /></a></p>
<p>แล้วก็เลือก Action ที่เราต้องการ ดังรูป ( เราก็เลือก setHelloWorld)</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/newevent.png" rel="lightbox[706]"><img class="size-medium wp-image-740 aligncenter" title="newevent" src="http://www.macfeteria.com/wp-content/uploads/2009/03/newevent-300x157.png" alt="newevent" width="300" height="157" /></a></p>
<p>แล้วเราก็ลอง Compile แล้วก็ลอง กด ไปที่ปุ่ม แล้วก็เลื่อน mouse ออกไป จนสุดๆ จะเห็นว่า ปุ่มของเราจะเปลี่ยนเป็น Hello Macfeteria ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/03/macfeteria.png" rel="lightbox[706]"><img class="size-medium wp-image-741 aligncenter" title="macfeteria" src="http://www.macfeteria.com/wp-content/uploads/2009/03/macfeteria-195x300.png" alt="macfeteria" width="195" height="300" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">ก็เป็นอันจบ สำหรับ tutorial นี้ครับ คิดว่าน่าจะเข้าใจ เรื่องของ Action &amp; Event รวมถึง Outlet นะครับ ครั้งหน้าเราจะได้ลองใช้งาน UI อื่นๆเพิ่มมากขึ้น</p>
<p style="text-align: left;">สงสัย แนะนำ คอมเม้น กันได้ครับ ถามใน Forum ก็ได้ครับ</p>
<p style="text-align: left;">

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/cocoa' rel='tag' target='_self'>cocoa</a>, <a class='technorati-link' href='http://technorati.com/tag/cocoa+touch' rel='tag' target='_self'>cocoa touch</a>, <a class='technorati-link' href='http://technorati.com/tag/iphone' rel='tag' target='_self'>iphone</a>, <a class='technorati-link' href='http://technorati.com/tag/programming' rel='tag' target='_self'>programming</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/03/11/iphone-programming-ii-event-action/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

