<?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; objective-c</title>
	<atom:link href="http://www.macfeteria.com/blog/tag/objective-c/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 VIII: Tabbar</title>
		<link>http://www.macfeteria.com/blog/2009/10/14/iphone-programming-viii-tabbar/</link>
		<comments>http://www.macfeteria.com/blog/2009/10/14/iphone-programming-viii-tabbar/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 13:29:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tabbar]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=1143</guid>
		<description><![CDATA[ว่าจะเขียนเรื่องการใช้งาน UITabbar มานานนะ ยังไม่มีโอกาสสักที วันนี้วันนี้เขียน tutorial เล็กๆสักอันละกัน จะว่าไปแล้ว iPhone App หลายตัวที่เห็นๆกันก็มักจะมีหลายๆ view เสมอ น้อยมากที่จะมีแค่ view เดียวหรือสอง และที่เห็นได้บ่อยๆก็คือการใช้ Navigation Controller และ Tabbar สำหรับวันนี้เราจะทำความเข้าใจเกี่ยวกับ UITabbar ครับว่ามันใช้ยังไง และส่วนประกอบต่างๆนั้นประกอบไปด้วยอะไร Start เริ่มจากสร้างโปรเจคก่อนเลยครับ อันดับแรกโปรเจคที่เราจะสร้างวันนี้ เราจะใช้ template แบบ Tabbar ดังรูปครับ เราก็ตั้งชื่ออะไรก็ได้ตามใจเรา ในตัวอย่างนี้ผมตั้งชื่อว่า TabbarSample ก็แล้วกันนะครับ เมื่อเสร็จแล้วก็จะได้ โปรเจคดังรูป ยังไม่ต้องทำอะไร ลอง compile &#38; run เล่นๆเลยครับ ก็จะเห็นว่า นี่ไง Tabbar โผล่มาให้ทันที ง่ายไม๊ครับ ? มันก็คงจะง่ายอะนะครับ ถ้าหากว่า เราใช้แค่ 2 [...]]]></description>
			<content:encoded><![CDATA[<p>ว่าจะเขียนเรื่องการใช้งาน UITabbar มานานนะ ยังไม่มีโอกาสสักที วันนี้วันนี้เขียน tutorial เล็กๆสักอันละกัน<br />
จะว่าไปแล้ว iPhone App หลายตัวที่เห็นๆกันก็มักจะมีหลายๆ view เสมอ น้อยมากที่จะมีแค่ view เดียวหรือสอง และที่เห็นได้บ่อยๆก็คือการใช้ Navigation Controller และ Tabbar สำหรับวันนี้เราจะทำความเข้าใจเกี่ยวกับ UITabbar ครับว่ามันใช้ยังไง และส่วนประกอบต่างๆนั้นประกอบไปด้วยอะไร</p>
<h2>Start</h2>
<p>เริ่มจากสร้างโปรเจคก่อนเลยครับ อันดับแรกโปรเจคที่เราจะสร้างวันนี้ เราจะใช้ template แบบ Tabbar ดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/1.gif" rel="lightbox[1143]"><img class="size-medium wp-image-1144 aligncenter" title="1" src="http://www.macfeteria.com/wp-content/uploads/2009/10/1-300x242.gif" alt="1" width="300" height="242" /></a></p>
<p>เราก็ตั้งชื่ออะไรก็ได้ตามใจเรา ในตัวอย่างนี้ผมตั้งชื่อว่า TabbarSample ก็แล้วกันนะครับ เมื่อเสร็จแล้วก็จะได้ โปรเจคดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/2.gif" rel="lightbox[1143]"><img class="size-medium wp-image-1145 aligncenter" title="2" src="http://www.macfeteria.com/wp-content/uploads/2009/10/2-300x212.gif" alt="2" width="300" height="212" /></a></p>
<p>ยังไม่ต้องทำอะไร ลอง compile &amp; run เล่นๆเลยครับ ก็จะเห็นว่า นี่ไง Tabbar โผล่มาให้ทันที</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/3.gif" rel="lightbox[1143]"><img class="size-medium wp-image-1146 aligncenter" title="3" src="http://www.macfeteria.com/wp-content/uploads/2009/10/3-156x300.gif" alt="3" width="156" height="300" /></a></p>
<p>ง่ายไม๊ครับ ? มันก็คงจะง่ายอะนะครับ ถ้าหากว่า เราใช้แค่ 2 view เอาละ ต่อไปเราจะเข้าใจ Tabbar แบบลึกซึ้งกันดีกว่า ว่าจริงๆแล้ว มีอะไรต้องเข้าใจบ้าง</p>
<h2>Tabbar</h2>
<p>เอาละครับ ก่อนที่จำทำการใดๆ เราควรจะรู้ในแต่ละส่วนก่อนว่า Tabbar นี่มันประกอบไปด้วยส่วนใดบ้าง เราต้องเข้าใจก่อนนะครับว่า การที่เราสร้างโปรเจคแบบ tabbar นั้น apple เค้าได้ทำอะไรมาให้เรามั่ง</p>
<p>อันดับแรกนะครับ โปรเจคของเราจะมี 2 view นั่นคือ FirstView กับ SecondView แต่ทั้งสองอย่างนี้ไม่เหมือนกันครับ</p>
<ul>
<li>FirstView นี้จะมีแค่ .h และ .m โดยที่ไม่มี .xib</li>
<li>Second นี้จะมีแค่ .xib</li>
</ul>
<p>จริงๆแล้วจุดประสงค์ของ template นี้แค่ต้องการให้รู้ว่า เราสามารถใช้ tabbar โดยที่แต่ละ view นั้น</p>
<ul>
<li>สามารถเป็นเฉพาะ .xib</li>
<li>หรือ แบบมีแต่ code</li>
<li>หรือแม้กระทั่งแบบ ที่มีทั้ง code และ interface</li>
</ul>
<p>เอาละครับต่อไป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/4.png" rel="lightbox[1143]"><img class="size-medium wp-image-1147 aligncenter" title="4" src="http://www.macfeteria.com/wp-content/uploads/2009/10/4-300x262.png" alt="4" width="300" height="262" /></a></p>
<p>ดูจากรูป อธิบายตามหมายเลขนะครับ</p>
<p>จุดที่ 1. จะเห็นว่ามี Tabbar Controller นะครับ ประกอบไปด้วย ส่วนย่อยๆอีก</p>
<ul>
<li>Tab Bar เป็นส่วนของตัวควบคุม</li>
<li>First View Controller</li>
<li>Second View Controller</li>
</ul>
<p>จุดที่ 2.  ตรงนี้นะครับจะเห็นว่าผมเลือกไปยัง First View ถ้าหากดูที่ inspector ( จุดที่ 3 ) ตามเส้นสีแดงจะเห็นว่า Class นั้นเป็น FirstViewController  และถ้าดูต่อไปยัง จุดที่ 4 ก็จะเห็น .h .m ของ FirstViewController <span style="text-decoration: underline;">ตรงนี้จะสังเกตุเห็นว่า FirstViewController นั้นไม่มี .xib</span> เหมือนที่ผมได้บอกไปตั้งแต่แรกครับว่า เค้าให้เราใช้ Main นี่เหละเป็นส่วน interface ของ firstview  จุดที่ 5 จะเห็นว่า SecondView นั้นมีแค่ .xib</p>
<p>และถ้ากดไปที่ SecondView นะครับจะเห็นหน้าตาแบบนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/5.png" rel="lightbox[1143]"><img class="size-medium wp-image-1148 aligncenter" title="5" src="http://www.macfeteria.com/wp-content/uploads/2009/10/5-238x300.png" alt="5" width="238" height="300" /></a></p>
<p>จะเห็นว่า ใน inspector ได้ถูกตั้งค่า NIB Name ให้เป็น SecondView และถ้าสังเกตดูดีๆ จะที่ขีดเส้นไว้ครับ ว่า First กับ Second นั้นเป็น View คนละแบบกัน</p>
<ul>
<li>Tab แรก (Fisrt) นั้นเป็น FirstViewController</li>
<li>Tab สอง (Second) นั้นเป็น UIViewController</li>
</ul>
<p>มาถึงจุดนี้อาจจะงง ?</p>
<h2>Next, add new tabbar</h2>
<p>เพื่อความเข้าใจ สร้าง tab ที่ 3 กันดีกว่า ดูรูปเลยครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/6.png" rel="lightbox[1143]"><img class="size-medium wp-image-1149 aligncenter" title="6" src="http://www.macfeteria.com/wp-content/uploads/2009/10/6-300x219.png" alt="6" width="300" height="219" /></a></p>
<p>ก็เป็นอันว่าได้ tabbar มาเพ่ิมละ แต่ว่ามันยังจะใช้ไม่ได้ครับ ลำดับต่อไป เราจะ Add Class เข้ามาครับ โดยการ click ขวาแล้วก็เลือก Add new file ครับ แล้วก็เลือกตามรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/7.png" rel="lightbox[1143]"><img class="size-medium wp-image-1150 aligncenter" title="7" src="http://www.macfeteria.com/wp-content/uploads/2009/10/7-300x185.png" alt="7" width="300" height="185" /></a></p>
<p>หลังจากนั้นก็ตั้งชื่อครับ แล้วเราจะได้ File มาทั้งหมด 3 files ด้วยกันนั่นก็คือ .h .m .xib  ในตัวอย่างนี้ผมตั้งชื่อว่า third แล้วกันนะครับ ต่อไปครับเราจะเขียนโปรแกรมง่ายๆใน view นี้กัน โดยที่โปรแกรมทำงาน ง่ายๆครับคือ กดปุ่ม แล้ว ก็คำว่า Hello โผล่ขึ้นมา</p>
<p>เอาละครับดูที่ Class กันก่อน</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> ThirdView <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	IBOutlet UILabel <span style="color: #002200;">*</span>helloLabel;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> sayHello<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>ลำดับต่อไปดูที่ implement ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> ThirdView
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> sayHello<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>
	helloLabel.text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello&quot;</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>viewDidUnload
<span style="color: #002200;">&#123;</span>
<span style="color: #002200;">&#125;</span>
<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: #a61390;">@end</span></pre></div></div>

<p>ไม่ซับซ้อนอะไรนะครับ แล้วก็เปิด ThirdView.xib เพื่อสร้าง button และ label พร้อมกับเชื่อม interface ให้เข้ากับ code</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/8.png" rel="lightbox[1143]"><img class="size-medium wp-image-1151 aligncenter" title="8" src="http://www.macfeteria.com/wp-content/uploads/2009/10/8-300x196.png" alt="8" width="300" height="196" /></a></p>
<p>ณ ตอนนี้ เราก็ได้เขียนโปรแกรมในส่วนของ Third View เสร็จเรียบร้อยแล้ว</p>
<p><span style="text-decoration: underline;">**** จากตรงนี้เองจะเห็นว่า **** ThirdView นั้นสามารถแยกเขียนได้  เราไม่ได้ไปทำอะไรกับ FirstView และ SecondView เลย</span> มันเป็นข้อดีมากๆครับ ที่เราสามารถจะแบ่งในแต่ละ ส่วน ออกจากกันได้</p>
<p>เอาละครับต่อไป เราจะทำในสิ่งสุดท้าย นั่นก็คือ ทำให้กด Tab แล้วมันโหลด ThridView ขึ้นมานั่นเอง เรากลับไปยัง MainWindow.xib ครับ เราก็กดไปที่ tabbar แล้วก็เลือก thirdView  ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/9.png" rel="lightbox[1143]"><img class="size-medium wp-image-1152 aligncenter" title="9" src="http://www.macfeteria.com/wp-content/uploads/2009/10/9-300x248.png" alt="9" width="300" height="248" /></a></p>
<p>และในส่วนของ Class Identity ให้เปลี่ยนเป็น ThirdView นะครับไม่งั้นเวลา run มันจะ crash</p>
<p>ถ้าเรียบร้อยแล้วก็จะเห็นแบบนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/10.gif" rel="lightbox[1143]"><img class="size-medium wp-image-1153 aligncenter" title="10" src="http://www.macfeteria.com/wp-content/uploads/2009/10/10-191x300.gif" alt="10" width="191" height="300" /></a></p>
<p>ลอง Compile แล้ว run ดูครับ เท่านี้ก็เรียบร้อยครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/11.gif" rel="lightbox[1143]"><img class="size-medium wp-image-1154 aligncenter" title="11" src="http://www.macfeteria.com/wp-content/uploads/2009/10/11-156x300.gif" alt="11" width="156" height="300" /></a></p>
<p>ถ้าใครอยากจะใส่รูปลงไปใน tab ก็ให้สร้าง ไฟล์ .png ขนาด 28&#215;28 ( จะกว้างยาวพอดี ) แล้วก็กำหนดให้เป็น transparent ครับ แล้วก็ใช้สีดำ ในการ วาด</p>
<p>แล้วเราก็เพ่ิมรูปเข้ามายังโปรเจคของเรา แล้วก็เปลี่ยน  icon ดังในรูปแบบนี้ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/10/12.gif" rel="lightbox[1143]"><img class="size-medium wp-image-1156 aligncenter" title="12" src="http://www.macfeteria.com/wp-content/uploads/2009/10/12-300x231.gif" alt="12" width="300" height="231" /></a></p>
<p>เท่านี้ก็เรียบร้อยครับ</p>
<p>สรุปว่า ที่เราได้ทำไปทั้งหมดนั้น เราได้ลองใช้ tabbar ไปทั้งหมด 3 แบบ สิ่งที่ผมจะแนะนำก็คือ</p>
<p>1. ถ้าหากเราต้องการจะสร้าง tabbar  ที่หน้า view มีการตอบโต้ อย่างเช่นการกดปุ่ม อะไรทำนองนี้ก็ควรจะ add view controller เข้ามาแบบที่เราได้ทำกัน<br />
2. ถ้าหน้าที่เราต้องการมีแค่การแสดง info เช่นหน้า about เราแค่สร้างไฟล์ .xib ขึ้นมาเฉยๆ ก็ได้ครับ</p>
<p>ถ้าหาก งง ตรงไหน อ่านไม่เข้าใจ มีคำติชม ก็เม้นกันได้ครับ</p>

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

<p class='technorati-tags'>Technorati Tags: <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/tabbar' rel='tag' target='_self'>tabbar</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/10/14/iphone-programming-viii-tabbar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Static Lib</title>
		<link>http://www.macfeteria.com/blog/2009/09/29/static-lib/</link>
		<comments>http://www.macfeteria.com/blog/2009/09/29/static-lib/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 04:40:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=1106</guid>
		<description><![CDATA[ห่างหายจากการเขียน tutorial ไปนานพอสมควร เมื่อวันก่อนมีคนมาถามผมใน Forums ว่าสร้างและใช้ Lib อย่างไร วันนี้เลยเขียน Blog เลยดีกว่า สำหรับใครที่ยังไม่รู้ว่า Static Lib คืออะไร ผมอธิบายง่ายๆว่ามันคือ การรวมชุดคำสั่ง เข้าไว้ด้วยกัน อาทิเช่น เราเขียนโปรแกรมคำนวน ด้วยสูตร ต่างๆที่ซับซ้อน และเราก็ต้องการใช้สูตรเหล่านี้ กับโปรแกรมอื่นๆ วิธีการก็คือ copy code มาแล้วก็ paste ลงไป ซึ่งมันก็ไม่สะดวก เพราะบางที code มันมีหลายพัน บรรทัด เราจึงเขียนมันออกมา เป็น Library และข้อดีของ Library คือหลังจากการ Compile ไปแล้ว เราสามารถให้คนอื่นเอาไปใช้ต่อ โดยที่ใช้แค่ .h และ lib เท่านั้น ตัว Source ไม่ต้องเอาไป วันนี้สิ่งที่จะเขียนกันก็คือ Library ง่าย [...]]]></description>
			<content:encoded><![CDATA[<p>ห่างหายจากการเขียน tutorial ไปนานพอสมควร เมื่อวันก่อนมีคนมาถามผมใน Forums ว่าสร้างและใช้ Lib อย่างไร วันนี้เลยเขียน Blog เลยดีกว่า สำหรับใครที่ยังไม่รู้ว่า Static Lib คืออะไร ผมอธิบายง่ายๆว่ามันคือ การรวมชุดคำสั่ง เข้าไว้ด้วยกัน อาทิเช่น เราเขียนโปรแกรมคำนวน ด้วยสูตร ต่างๆที่ซับซ้อน และเราก็ต้องการใช้สูตรเหล่านี้ กับโปรแกรมอื่นๆ วิธีการก็คือ copy code มาแล้วก็ paste ลงไป ซึ่งมันก็ไม่สะดวก เพราะบางที code มันมีหลายพัน บรรทัด เราจึงเขียนมันออกมา เป็น Library และข้อดีของ Library คือหลังจากการ Compile ไปแล้ว เราสามารถให้คนอื่นเอาไปใช้ต่อ โดยที่ใช้แค่ .h และ lib เท่านั้น ตัว Source ไม่ต้องเอาไป</p>
<p>วันนี้สิ่งที่จะเขียนกันก็คือ Library ง่าย เอาละครับ ลงมือกันเลยดีกว่าเพื่อเป็นการไม่เสียเวลา</p>
<h2>Static Lib Project</h2>
<p>ก่อนอื่นเลยเราสร้าง Project ใหม่ขึ้นมาให้ชื่อว่า MyLib โดยเราเลือก Project Template ให้เป็น แบบ Static Library ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static1.png" rel="lightbox[1106]"><img class="size-medium wp-image-1107 aligncenter" title="static1" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static1-300x221.png" alt="static1" width="300" height="221" /></a></p>
<p>หลังจากนั้นก็จะเห็น Project ประมาณดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static2.png" rel="lightbox[1106]"><img class="size-medium wp-image-1108 aligncenter" title="static2" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static2-300x185.png" alt="static2" width="300" height="185" /></a></p>
<p>จะเห็นว่า Project นั้นไม่ได้ให้ File อะไรมามากมาย เท่าการสร้างโปรเจคแบบอื่นๆเลย เอาละ ! ลำดับต่อไปคือ เพิ่ม Class เข้าไปยัง Project ของเรา  โดยผมให้ชื่อว่า MyClass  หลังจากเพ่ิม Class เข้าไปแล้วก็จะเห็น File เข้ามาดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static2-1.png" rel="lightbox[1106]"><img class="size-medium wp-image-1109 aligncenter" title="static2-1" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static2-1-300x204.png" alt="static2-1" width="300" height="204" /></a></p>
<p>ต่อไปเราก็จะเขียน Code กัน</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// MyClass.h</span>
<span style="color: #11740a; font-style: italic;">// Header File</span>
<span style="color: #11740a; font-style: italic;">//----------------------</span>
<span style="color: #a61390;">@interface</span> MyClass <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
&nbsp;
<span style="color: #002200;">&#125;</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> sayHello;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ในส่วนของ implement ก็มี code ง่ายๆดังนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> MyClass
<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> sayHello
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello World&quot;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จาก code ข้างบน คือ ผมมี Class ที่ชื่อว่า MyClass โดยมีฟังก์ชั่น ที่ชื่อ sayHello แค่ฟังก์ชั่นเดียว โดยในฟังก์ชั่นนี้ก็คือ ส่งคำว่า Hello World กลับมานั่นเอง</p>
<p>หลังจากนั้นก็ Compile ครับ เมื่อ Compile แล้วจะเห็น LibMyLib.a ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static3.png" rel="lightbox[1106]"><img class="size-medium wp-image-1110 aligncenter" title="static3" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static3-300x224.png" alt="static3" width="300" height="224" /></a></p>
<p>ลำดับต่อไปคือ เอามาใช้  การที่เราจะเอา Lib มาใช้นั้นสิ่งที่ต้องการมีอยู่สองอย่างครับคือ</p>
<ul>
<li>Compile Lib ( File นามสกุล .a )</li>
<li>Header ( File นามสกุล .h )</li>
</ul>
<p>จากรูปข้างบน จะเห็น path ของ lib ที่เราสร้างขึ้นมาครับ เราก็ไป  copy เอามาไว้ยัง Folder ใหม่ พร้อมกับ File .h</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static6.png" rel="lightbox[1106]"><img class="size-medium wp-image-1111 aligncenter" title="static6" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static6-300x202.png" alt="static6" width="300" height="202" /></a></p>
<p>ส่วนไฟล์อื่นๆ หลังจากการ Compile แล้วก็ไม่จำเป็นครับ</p>
<p>ต่อไปคือสร้าง โปรเจคที่ใช้งาน Lib ของเรา</p>
<h2>Say Hello Project</h2>
<p>เราก็สร้างโปรเจค ขึ้นมาใหม่ ผมตั้งชื่อว่า DemoLib เป็นแบบ View Base ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static4.png" rel="lightbox[1106]"><img class="size-medium wp-image-1112 aligncenter" title="static4" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static4-300x221.png" alt="static4" width="300" height="221" /></a></p>
<p>เมื่อเราสร้างเรียบร้อยแล้ว ต่อไปคือ เอามาใช้ .. สิ่งที่ต้องทำต่อไปคือเอา 2 Files ที่ได้จากโปรเจค แรก เข้ามายัง โปรเจคใหม่ โดยกด Click ขวาที่โปรเจค แล้วก็เลือก Add ครับดังรูปครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static5.png" rel="lightbox[1106]"><img class="size-medium wp-image-1113 aligncenter" title="static5" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static5-300x185.png" alt="static5" width="300" height="185" /></a></p>
<p>เมื่อกด Add &gt;&gt; Existing Files &#8230;  แล้วจะเห็น หน้าต่างดังรูป ที่ผม ได้ขีดเส้นไว้คือ ถ้าหากเราเลือก option นี้มันจะ copy file มายังโปรเจคของเราเลย อันนี้ก็แล้วแต่สะดวกนะครับ ว่าจะให้มัน copy file มาหรือไม่ต้อง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static7.png" rel="lightbox[1106]"><img class="size-medium wp-image-1114 aligncenter" title="static7" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static7-300x213.png" alt="static7" width="300" height="213" /></a></p>
<p>เมื่อเสร็จเรียบร้อยแล้ว ก็จะเห็นว่ามี File เข้ามายังโปรเจคของเราแล้ว ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static8.png" rel="lightbox[1106]"><img class="size-medium wp-image-1115 aligncenter" title="static8" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static8-300x201.png" alt="static8" width="300" height="201" /></a></p>
<p>ต่อไปครับ ลงมือเขียน code กัน</p>
<p>โดยที่โปรแกรมที่เราจะเขียน ก็ง่ายๆครับ คือกด ปุ่ม แล้วให้ Lable มันเปลี่ยนเป็นคำว่า Hello World เท่านั้นเอง</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Demo View Controller Header</span>
<span style="color: #a61390;">@interface</span> DemoLibViewController <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	IBOutlet UILabel<span style="color: #002200;">*</span> text;
<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> clickSayHello;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จาก ข้างบนเราประกาศ Outlet แค่ UILabel กับ Action ที่ชื่อ clickSayHello</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;MyClass.h&quot;</span>
<span style="color: #a61390;">@implementation</span> DemoLibViewController
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> clickSayHello
<span style="color: #002200;">&#123;</span>
	text.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>MyClass sayHello<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ส่วน implement นั้น จะสังเกต เห็นว่าเรา ได้เรียนใช้  [MyClass sayHello]; ซึ่งเป็น Library ที่เราได้สร้างมานั่นเอง โดยที่ฟังก์ชั่นนี้ก็คือ ส่ง String กลับมาเป็นคำว่า Hello World นั่นเอง<br />
และสุดท้าย ก็ออกแบบหน้าตาของโปรแกรมด้วย interface builder ครับ แล้วเราก็เชื่อม Action/ Outlet ให้เรียบร้อยดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static9.png" rel="lightbox[1106]"><img class="size-medium wp-image-1116 aligncenter" title="static9" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static9-300x124.png" alt="static9" width="300" height="124" /></a></p>
<p>เท่านี้ก็เป็นอันเสร็จแล้ว เมื่อเรา compile / run ก็จะเห็นหน้าตาโปรแกรมดังรูป เมื่อกด Say Hello คำว่า Label ก็จะเปลี่ยนเป็นคำว่า Hello World ครับ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/09/static10.png" rel="lightbox[1106]"><img class="size-medium wp-image-1117 aligncenter" title="static10" src="http://www.macfeteria.com/wp-content/uploads/2009/09/static10-156x300.png" alt="static10" width="156" height="300" /></a></p>
<p>สำหรับวันนี้ ก็เป็น tutorial ง่ายๆ แต่รับรองว่า มีประโยชน์ แน่ๆครับ ติชม ยังไง ก็ เม้นกันมาได้ครับ</p>

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

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/library' rel='tag' target='_self'>library</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></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/09/29/static-lib/feed/</wfw:commentRss>
		<slash:comments>2</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>Cocoa Programming IV : Array Controller</title>
		<link>http://www.macfeteria.com/blog/2009/02/27/cocoa-programming-iv-array-controller/</link>
		<comments>http://www.macfeteria.com/blog/2009/02/27/cocoa-programming-iv-array-controller/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 09:21:50 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[NSArrayController]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=670</guid>
		<description><![CDATA[เมื่อวันก่อนๆ ได้เรียนรู้เกี่ยวกับ การใช้งาน Binding และ MVC กันไปแล้วสำหรับวันนี้จะได้นำมาใช้กับ NSArrayController กัน ก็อย่างที่บอกไปแล้วว่าการเขียนโปรแกรมด้วย Cocoa นั้นค่อนข้างจะมีการใช้งาน MVC ค่อนข้างเยอะ และ code ส่วนมากก็คือการนำ data มาแสดงผล ซึ่ง class ที่ต้องเกี่ยวข้องก็คือ Controller ( Model &#8211; View &#8211; Controller ) NSController ก็คือ Class ที่ช่วยให้เราลดการเขียน Glue Code ( class ที่เป็นตัวเชื่อมในการนำข้อมูลออกมาแสดงผลที่ interface ) แต่ class ที่เราจะทดลองใช้กันจริงๆก็คือ NSArrayController ซึ่งเป็น subclass ของ NSController และวันนี้เราจะได้มาสร้างโปรแกรมง่ายๆกัน นั่นคือ โปรแกรมที่เอาไว้เก็บ คะแนน ของนักเรียน เหมือนดังที่เราได้ทดลองเขียนกันในตอนใช้งาน [...]]]></description>
			<content:encoded><![CDATA[<p>เมื่อวันก่อนๆ ได้เรียนรู้เกี่ยวกับ การใช้งาน Binding และ MVC กันไปแล้วสำหรับวันนี้จะได้นำมาใช้กับ NSArrayController กัน</p>
<p>ก็อย่างที่บอกไปแล้วว่าการเขียนโปรแกรมด้วย Cocoa นั้นค่อนข้างจะมีการใช้งาน MVC ค่อนข้างเยอะ และ code ส่วนมากก็คือการนำ data มาแสดงผล ซึ่ง class ที่ต้องเกี่ยวข้องก็คือ Controller ( Model &#8211; View &#8211; Controller )</p>
<p>NSController ก็คือ Class ที่ช่วยให้เราลดการเขียน Glue Code ( class ที่เป็นตัวเชื่อมในการนำข้อมูลออกมาแสดงผลที่ interface ) แต่ class ที่เราจะทดลองใช้กันจริงๆก็คือ NSArrayController ซึ่งเป็น subclass ของ NSController และวันนี้เราจะได้มาสร้างโปรแกรมง่ายๆกัน นั่นคือ โปรแกรมที่เอาไว้เก็บ คะแนน ของนักเรียน เหมือนดังที่เราได้ทดลองเขียนกันในตอนใช้งาน NSTableView ครั้งก่อนๆ</p>
<p>เริ่มเลยละกัน ก่อนอื่นเราก็สร้าง Cocoa Application โปรเจคขึ้นมาใหม่ โดยให้ชื่อว่า StudentScoreReport ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/newproject.png" rel="lightbox[670]"><img class="size-medium wp-image-671 aligncenter" title="newproject" src="http://www.macfeteria.com/wp-content/uploads/2009/02/newproject-300x232.png" alt="newproject" width="300" height="232" /></a></p>
<p>และหลังจากนั้นเราก็ เพ่ิม class ที่ชื่อว่า AppController เหมือนเดิม แล้วก็เพ่ิม class ที่มีชื่อว่า StudentData เข้าไปด้วย</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/addclass.png" rel="lightbox[670]"><img class="size-medium wp-image-672 aligncenter" title="addclass" src="http://www.macfeteria.com/wp-content/uploads/2009/02/addclass-300x184.png" alt="addclass" width="300" height="184" /></a></p>
<p>ส่วน Source Code ของ ทั้งสอง class ก็มีดังนี้</p>
<p>AppController.h</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;Cocoa/Cocoa.h&gt;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> AppController <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>m_studentList;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>m_studentList;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>AppController.m</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;AppController.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> AppController
<span style="color: #a61390;">@synthesize</span> m_studentList;
<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_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: #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> 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: #a61390;">@end</span></pre></div></div>

<p>จาก code ข้างบนจะเห็นว่า AppController นั้นมีแค่ ตัวแปรเดียว คือ m_studentList ที่เป็น Mutable Array เท่านั้น และในส่วนของ code ก็ไม่มีอะไรเลย นอกจาก init และ dealloc เท่านั้นเอง</p>
<p>StudentData.h</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: #a61390;">int</span> m_score;
	<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>m_name;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>readwrite,assign<span style="color: #002200;">&#41;</span> <span style="color: #a61390;">int</span> m_score;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>readwrite,copy<span style="color: #002200;">&#41;</span>	<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>m_name;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>StudentData.m</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> StudentData
<span style="color: #a61390;">@synthesize</span> m_name;
<span style="color: #a61390;">@synthesize</span> m_score;
<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>
	<span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span>;
	m_name <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;No Name&quot;</span>;
	m_score <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</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> dealloc
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>m_name 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 ในส่วนของ StudentData นั้นเราได้มี ตัวแปรสองตัวที่เอาไว้เก็บ ชื่อ และ คะแนน ของนักเรียน จะเห็นว่า code ของทั้งสอง class นั้น แทบจะเรียกว่าไม่มีอะไรเลย นอกจาก การ init และ dealloc เพียงเท่านั้นเอง หลังจากนั้น เราก็เปิด MainMenu.xib ขึ้นมา เพื่อออกแบบ interface แล้วเราก็ออกแบบหน้าตาให้มีประมาณแบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/interface.png" rel="lightbox[670]"><img class="size-medium wp-image-674 aligncenter" title="interface" src="http://www.macfeteria.com/wp-content/uploads/2009/02/interface-300x238.png" alt="interface" width="300" height="238" /></a></p>
<p>เมื่อเราออกแบบเสร็จแล้วขั้นตอนต่อไปก็ทำเหมือนๆ เคยนั่นก็คือ เพ่ิม AppController Object เข้ามา ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/appcontroller1.png" rel="lightbox[670]"><img class="size-medium wp-image-675 aligncenter" title="appcontroller1" src="http://www.macfeteria.com/wp-content/uploads/2009/02/appcontroller1-300x205.png" alt="appcontroller1" width="300" height="205" /></a></p>
<p>ลำดับต่อไปก็คือ เราจะเพ่ิม Array Controller เข้ามายัง xib ของเรา โดยที่เราก็ลาก Array Controller จาก Library เข้ามา ก็จะเห็นดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/array.png" rel="lightbox[670]"><img class="size-medium wp-image-676 aligncenter" title="array" src="http://www.macfeteria.com/wp-content/uploads/2009/02/array-300x179.png" alt="array" width="300" height="179" /></a></p>
<p>แล้วเมื่อเรามี Array Controller แล้ว ต่อมาเราก็จะ set attribute ของ Array Controller ของเรากัน สิ่งที่เราจะต้อง set ก็คือ Object Controller เราก็เลือกเป็น StudentData และเราก็เพ่ิม key เข้าไป 2 key นั่นก็คือ m_name  และ m_score ตามรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/attributes.png" rel="lightbox[670]"><img class="size-medium wp-image-677 aligncenter" title="attributes" src="http://www.macfeteria.com/wp-content/uploads/2009/02/attributes-300x188.png" alt="attributes" width="300" height="188" /></a></p>
<p>ที่เราได้ทำไปนั้น คือเป็นการบอกว่า ให้ Array Controller ตัวนี้จัดการกับ StudentData และเราก็ได้ เพิ่ม key เข้าไปเพื่อให้ Array Controller ของเราได้ เข้าสู่ข้อมูลของ StudentData ได้นั่นก็คือ m_name และ m_score</p>
<p>หลังจากนั้นเราจะ Bind Array Controller เข้ากับ App Controller เพื่อให้ Array Controller ตัวนี้จัดการ array โดยมี m_studentList เป็นตัวเก็บข้อมูล</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/bind_key.png" rel="lightbox[670]"><img class="size-medium wp-image-679 aligncenter" title="bind_key" src="http://www.macfeteria.com/wp-content/uploads/2009/02/bind_key-215x300.png" alt="bind_key" width="215" height="300" /></a></p>
<p>เมื่อเสร็จตรงส่วนี้แล้ว เราก็จะไป Bind ข้อมูลในตรางที่เราได้สร้างขึ้นมา กับ Array Controller ของเรา วิธีการก็คือ เลือกไปที่ Column ของ Table แล้วก็ตั้งค่าของ Value ให้มี Control Key เป็น arrangedObjects และ Model Key Path เป็น m_name ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/bind_name.png" rel="lightbox[670]"><img class="size-medium wp-image-678 aligncenter" title="bind_name" src="http://www.macfeteria.com/wp-content/uploads/2009/02/bind_name-300x161.png" alt="bind_name" width="300" height="161" /></a></p>
<p>และอีก Column ก็ทำเหมือนกัน แต่เราเปลี่ยน Model Key Path ให้เป็น m_score ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/bind_score.png" rel="lightbox[670]"><img class="size-medium wp-image-680 aligncenter" title="bind_score" src="http://www.macfeteria.com/wp-content/uploads/2009/02/bind_score-300x245.png" alt="bind_score" width="300" height="245" /></a></p>
<p>เพียงเท่านี้ก็เป็นอันเสร็จ ขึ้นตอนการ Bind</p>
<p>สรุป</p>
<ul>
<li>เราได้ Bind &#8211; Array Controller ของเราเข้ากับ App Controller โดยมี m_studentList เป็น key</li>
<li>และเราก็ได้ Bind ค่าที่จะแสดงผลที่ Table เข้ากับ Array Controller โดยใช้ m_name และ m_score เป็น key</li>
</ul>
<p>แต่ยังไม่เสร็จ เหลือส่วนสุดท้ายก็คือ Button ของเรานั่นเอง อย่างที่บอกไปแล้วว่า Array Controller  ของเรานั้นจัดการ Array ให้เราตั้งแต่ Add, Remove, Insert ข้อมูล ดังนั้นเราก็ไม่ต้องไปเขียน method พวกนี้ ( ลดการเขียน Glue Code )</p>
<p>เพียงแค่เราเชื่อม Action ที่ต้องเรา เข้ากับ ปุ่มที่เรามี เพียงเท่านี้ก็ใช้งานได้  ดูรูปประกอบ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/link_action.png" rel="lightbox[670]"><img class="size-medium wp-image-681 aligncenter" title="link_action" src="http://www.macfeteria.com/wp-content/uploads/2009/02/link_action-300x158.png" alt="link_action" width="300" height="158" /></a></p>
<p>จากรูป ข้างบน เราได้เชื่อม Received Action &#8211; add เข้า ปุ่ม Add ของเรา และ ก็เชื่อม Received Action &#8211; remove เข้ากับปุ่ม Remove เพียงเท่านี้ก็เสร็จ</p>
<p>ลอง Compile ดูครับ แล้วเราก็จะพบกับ หน้าต่าง Windows เหมือนดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/result1.png" rel="lightbox[670]"><img class="size-medium wp-image-682 aligncenter" title="result1" src="http://www.macfeteria.com/wp-content/uploads/2009/02/result1-300x238.png" alt="result1" width="300" height="238" /></a></p>
<p>ก็ลองกด Add ดูครับ จะเห็นว่า มี item เข้าไปยังตาราง แล้วเราก็ยังแก้ไขข้อมูล โดยการกด click ไปที่ตาราง และก็สามารถ remove item ได้ด้วย</p>
<p>จากโปรแกรมที่เราได้ลองเขียนไป จะเห็นว่าเราไม่ต้องไปเขียน method ที่ต้องเกี่ยวกับการจัดการข้อมูลของ Array รวมถึงการ จัดการข้อมูลที่ต้องแสดงในตารางเลย เพราะว่าเราได้ใช้ Binding , Key Value และการใช้ Property เข้ามาช่วย เราจึงลดการเขียน Glue Code ลงไปได้เยอะมาก ลองเปรียบเทียบกับที่เราได้เขียน Application ที่คล้ายกัน ตอนเมื่อผมเขียนการใช้งาน NSTableView ดูครับ</p>
<p>มีคำแนะนำติชม ก็เขียนเม้นกันครับ</p>

<!-- 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/NSArrayController' rel='tag' target='_self'>NSArrayController</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></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/02/27/cocoa-programming-iv-array-controller/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Books &amp; Extra Stuffs</title>
		<link>http://www.macfeteria.com/blog/2009/02/22/books-extra-stuffs/</link>
		<comments>http://www.macfeteria.com/blog/2009/02/22/books-extra-stuffs/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 04:27:17 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Talk]]></category>
		<category><![CDATA[carbon]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[stuff]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=599</guid>
		<description><![CDATA[หลายๆคนเริ่มลงมือเขียน iPhone ไปบ้างแล้ว และก็ผมก็ยินดีด้วยนะครับ ถ้าหากว่า blog ของผมเป็นจุดเริ่มในการเขียนโปรแกรมสำหรับ iPhone และ Mac. และในตอนนี้มีหนังสือ เกี่ยวกับการเขียนโปรแกรมสำหรับ iPhone ออกมาหลายเล่มทีเดียว สำหรับคนที่ยังไม่รู้ว่าควรจะซื้อเล่มไหน มาอ่าน ผมก็มีแนะนำหลายๆเล่มครับ สำหรับหนังสือ ที่ควรจะอ่านๆ ก็มีดังต่อไปนี้ Programming in Objective-C ถ้าเพิ่งเริ่มต้นเขียนโปรแกรม ผมแนะนำให้อ่านหนังสือ การเขียนโปรแกรมด้วยภาษา Objective-C ก่อน เพราะว่าการเขียนโปรแกรม ใน iPhone ต้องใช้ภาษา Objective-C ฉนั้นแล้วถ้าไม่รู้เรื่องมาก่อนเลย แนะนำ เล่มดังต่อไปนี้ หนังสือเล่มนี้สอนการเขียนโปรแกรมด้วยภาษา Objective-C ไว้ได้ดีมากๆ ตั้งแต่คนไม่เคยเขียนโปรแกรมมาก่อนก็สามารถอ่านได้ เหมาะสำหรับคนที่เพิ่งจะเริ่มเขียนโปรแกรมและในหนังสือ ยังได้กล่าวถึง Foundation Class ต่างๆที่ต้องรู้ อาทิเช่น NSNumber , NSArray เป็นตั้น และได้อธิบายการจัดการ Memory ในเบื้องต้นอีกด้วย รายละเอียดของหนังสือ Programming [...]]]></description>
			<content:encoded><![CDATA[<p>หลายๆคนเริ่มลงมือเขียน iPhone ไปบ้างแล้ว และก็ผมก็ยินดีด้วยนะครับ ถ้าหากว่า blog ของผมเป็นจุดเริ่มในการเขียนโปรแกรมสำหรับ iPhone และ Mac.</p>
<p>และในตอนนี้มีหนังสือ เกี่ยวกับการเขียนโปรแกรมสำหรับ iPhone ออกมาหลายเล่มทีเดียว สำหรับคนที่ยังไม่รู้ว่าควรจะซื้อเล่มไหน มาอ่าน ผมก็มีแนะนำหลายๆเล่มครับ สำหรับหนังสือ ที่ควรจะอ่านๆ ก็มีดังต่อไปนี้</p>
<h2>Programming in Objective-C</h2>
<p>ถ้าเพิ่งเริ่มต้นเขียนโปรแกรม ผมแนะนำให้อ่านหนังสือ การเขียนโปรแกรมด้วยภาษา Objective-C ก่อน เพราะว่าการเขียนโปรแกรม ใน iPhone ต้องใช้ภาษา Objective-C ฉนั้นแล้วถ้าไม่รู้เรื่องมาก่อนเลย แนะนำ เล่มดังต่อไปนี้</p>
<p style="text-align: center;"><img class="size-medium wp-image-600 aligncenter" title="Programming in Objective-c " src="http://www.macfeteria.com/wp-content/uploads/2009/02/objective-214x300.gif" alt="Objective-c Programming" width="214" height="300" /></p>
<p style="text-align: left;">หนังสือเล่มนี้สอนการเขียนโปรแกรมด้วยภาษา Objective-C ไว้ได้ดีมากๆ ตั้งแต่คนไม่เคยเขียนโปรแกรมมาก่อนก็สามารถอ่านได้ เหมาะสำหรับคนที่เพิ่งจะเริ่มเขียนโปรแกรมและในหนังสือ ยังได้กล่าวถึง Foundation Class ต่างๆที่ต้องรู้ อาทิเช่น NSNumber , NSArray เป็นตั้น และได้อธิบายการจัดการ Memory ในเบื้องต้นอีกด้วย</p>
<p style="text-align: left;">รายละเอียดของหนังสือ <a href="http://www.amazon.com/gp/product/0672325861?ie=UTF8&#038;tag=macfeteria-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0672325861">Programming in Objective-C</a><img src="http://www.assoc-amazon.com/e/ir?t=macfeteria-20&#038;l=as2&#038;o=1&#038;a=0672325861" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</p>
<h2 class="parseasinTitle"><span id="btAsinTitle">Programming in Objective-C 2.0</span></h2>
<p><span>หนังสือเล่มนี้คนเขียนเป็นคนเดียวกัน กับที่เขียน Programming in Objective-C 2.0 เนื้อหาภายในก็ไม่ได้ต่างกันมากมายนักกับ เล่ม Programming in Objective-C แต่จะเพิ่มเติมในส่วนของ Cocoa และ iPhone ไว้ด้วย </span></p>
<p style="text-align: center;"><span><img class="size-medium wp-image-601 aligncenter" title="Programming in Objective-C 2.0" src="http://www.macfeteria.com/wp-content/uploads/2009/02/objective2-214x300.gif" alt="objective2" width="214" height="300" /><br />
</span></p>
<p style="text-align: left;"><span>อาจจะงงว่า Objective-C กับ Objective-C 2.0 ต่างกันยังไง อธิบายได้ง่ายๆครับว่า มันก็เป็นภาษาเดิมนั่นเหละ ครับเพียงแต่ว่า 2.0 เนี่ยจะเพิ่มคุณสมบัติของภาษาเข้ามาใหม่ อาทิเช่นในเรื่องของ Garbage Collection , Property อะไรทำนองนี้ สำหรับผมคิดว่า เล่มนี้ ครอบคลุมหมดเลยครับ สำหรับการเขียนโปรแกรมเบื้องต้น </span></p>
<p style="text-align: left;">รายละเอียดของหนังสือ <a href="http://www.amazon.com/gp/product/0321566157?ie=UTF8&#038;tag=macfeteria-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321566157">Programming in Objective-C 2.0 (2nd Edition)</a><img src="http://www.assoc-amazon.com/e/ir?t=macfeteria-20&#038;l=as2&#038;o=1&#038;a=0321566157" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</p>
<h2 style="text-align: left;">Advance Mac OS X Programming</h2>
<p style="text-align: left;">หนังสือเล่มนี้เป็นการเขียนโปรแกรมสำหรับ Mac ค่อนข้างเขียนได้ดี แต่ว่ามันจะปนๆ กันระหว่าง C/C++ กับ Objective-C เนื้อหาหลายๆส่วนน่าสนใจมากๆอาทิเช่น การเขียน Share Memory Segment เป็นต้น</p>
<p style="text-align: center;"><img class="size-medium wp-image-602 aligncenter" title="advance" src="http://www.macfeteria.com/wp-content/uploads/2009/02/advance-214x300.gif" alt="advance" width="214" height="300" /></p>
<p style="text-align: left;">ถ้าไม่คิดจะเขียนโปรแกรมบน Mac กะว่าจะเขียนแต่ iPhone ก็ไม่จำเป็นเท่าไหร่ครับ เพราะว่ามันไม่ได้เขียนเกี่ยวกับ iPhone หรือ Cocoa เลย หนักไปทาง Unix</p>
<p style="text-align: left;">รายละเอียดหนังสือ <a href="http://www.amazon.com/gp/product/0974078514?ie=UTF8&#038;tag=macfeteria-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0974078514">Advanced Mac OS X Programming (2nd Edition of Core Mac OS X &#038; Unix Programming)</a><img src="http://www.assoc-amazon.com/e/ir?t=macfeteria-20&#038;l=as2&#038;o=1&#038;a=0974078514" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</p>
<h2 style="text-align: left;">Cocoa Programming for Mac OS X</h2>
<p style="text-align: left;">หนังสือการเขียนโปรแกรมด้วย Cocoa เล่มนี้นับว่าเป็นเล่มที่ดีที่สุดเลยก็ว่าได้ สอนการเขียนโปรแกรมด้วย Cocoa และการใช้งาน xcode กับ interface builder เบื้องต้น เนื้อหาเขียนได้ดีมากๆอ่านง่าย เป็นหนังสือที่ผมแนะนำเลยครับว่าต้องอ่าน เพราะมันจะปูทางไปสู่การเขียนโปรแกรมด้วย iPhone</p>
<p style="text-align: center;"><img class="size-medium wp-image-603 aligncenter" title="Cocoa Programming for Mac OS X" src="http://www.macfeteria.com/wp-content/uploads/2009/02/cocoa-214x300.gif" alt="cocoa" width="214" height="300" /></p>
<p style="text-align: left;">เหมาะกับทุกคนที่จะเขียนโปรแกรมด้วย Cocoa และตอนนี้หนังสือก็ได้ปรับปรุงมาถึง 3th edition แล้ว เนื้อหา update มากๆ</p>
<p style="text-align: left;">รายละเอียดของหนังสือ <a href="http://www.amazon.com/gp/product/0321503619?ie=UTF8&#038;tag=macfeteria-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321503619">Cocoa(R) Programming for Mac(R) OS X (3rd Edition)</a><img src="http://www.assoc-amazon.com/e/ir?t=macfeteria-20&#038;l=as2&#038;o=1&#038;a=0321503619" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</p>
<h2 style="text-align: left;">Xcode 3 Unleashed</h2>
<p style="text-align: left;">เป็นหนังสือสอนการใช้งาน Xcode ครับ สำหรับหนังสือเล่มนี้ เนื้อหาหลายๆอย่างอยู่ในขั้นกลางๆ ไปถึงขั้นสูง จริงๆแล้วเราสามารถหาอ่าน การใช้งาน Xcode ได้จากเวปของ apple เอง แต่มันไม่ค่อยจะ update มากนัก</p>
<p style="text-align: center;"><img class="size-medium wp-image-604 aligncenter" title="Xcode 3" src="http://www.macfeteria.com/wp-content/uploads/2009/02/xcode-214x300.gif" alt="Xcode 3" width="214" height="300" /></p>
<p style="text-align: left;">ถ้าใครที่ต้องการ การใช้งาน xcode ในระดับ advance เช่นการ ใช้งาน Instrument หรือว่าจะเป็น SVN, CVS ก็คุ้มค่านะครับ</p>
<p style="text-align: left;">รายละเอียดของหนังสือ <a href="http://www.amazon.com/gp/product/0321552636?ie=UTF8&#038;tag=macfeteria-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321552636">Xcode 3 Unleashed</a><img src="http://www.assoc-amazon.com/e/ir?t=macfeteria-20&#038;l=as2&#038;o=1&#038;a=0321552636" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<h2 style="text-align: left;">Beginning iPhone Development: Exploring the iPhone SDK</h2>
<p style="text-align: left;">หนังสือเล่มนี้เป็นหนังสือสอนเกี่ยวกับ การเขียนโปรแกรมสำหรับ iPhone ถ้าใครไม่รู้เรื่อง Cocoa มาก่อน ผมแนะนำให้ไปอ่าน Cocoa ก่อนครับ หนังสือเล่มนี้ สอนการใช้งาน Control ต่างๆไว้มากมาย</p>
<p style="text-align: center;"><img class="size-medium wp-image-605 aligncenter" title="iphoneprogrammingbookBeginning iPhone Development: Exploring the iPhone SDK" src="http://www.macfeteria.com/wp-content/uploads/2009/02/iphoneprogrammingbook-214x300.gif" alt="iphoneprogrammingbookBeginning iPhone Development: Exploring the iPhone SDK" width="214" height="300" /></p>
<p style="text-align: left;">ไม่ว่าจะเป็น button , combo box , address book ยังรวมไปถึง การใช้งาน Quartz เบื้องต้น และรวมถึงการใช้งาน multi-touch และ การใช้งานกล้องถ่ายรูปแนะนำอ่านอย่างยิ่งครับ</p>
<p style="text-align: left;">รายละเอียดของหนังสือ <a href="http://www.amazon.com/gp/product/1430224592?ie=UTF8&amp;tag=macfeteria-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1430224592">Beginning iPhone 3 Development: Exploring the iPhone SDK</a><img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.com/e/ir?t=macfeteria-20&amp;l=as2&amp;o=1&amp;a=1430224592" border="0" alt="" width="1" height="1" /></p>
<h2 style="text-align: left;">The iPhone Developer&#8217;s Cookbook: Building Applications with the iPhone SDK</h2>
<p style="text-align: left;">เล่มนี้ก็เขียนเกี่ยวกับ iPhone Programming โดยตรงเหมือนกัน แต่เล่มนี้เขียนต่างจากเล่มบนตรงที่ว่า ค่อนข้างจะลงลึกไปแต่ละ Control เช่นการใช้งาน Table ก็จะเขียนตั้งแต่การใช้งานในระดับง่าย จนถึงขั้นสูงเช่นการใส่รูปเข้าไปใน table แต่ก็ไม่ได้ครอบคลุมทุกๆ Control</p>
<p style="text-align: center;"><img class="size-medium wp-image-606 aligncenter" title="The iPhone Developer's Cookbook: Building Applications with the iPhone SDK" src="http://www.macfeteria.com/wp-content/uploads/2009/02/iphoneprogrammingcookbook-214x300.gif" alt="The iPhone Developer's Cookbook: Building Applications with the iPhone SDK" width="214" height="300" /></p>
<p style="text-align: left;">ถ้าหากมีงบจำกัดในการซื้อ ผมแนะนำให้ซื้อเล่ม Begining iPhone Development มากกว่า แต่ก็ยังแนะนำให้อ่านเล่มนี้ครับ เพราะว่าเนื้อหาบางอย่างในเล่ม Begining iPhone Development ไม่ได้บอกไว้เช่น พวก service ต่างๆ</p>
<p style="text-align: left;">รายละเอียดของหนังสือ <a href="http://www.amazon.com/gp/product/0321659570?ie=UTF8&#038;tag=macfeteria-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321659570">The iPhone Developer&#8217;s Cookbook: Building Applications with the iPhone 3.0 SDK (2nd Edition)</a><img src="http://www.assoc-amazon.com/e/ir?t=macfeteria-20&#038;l=as2&#038;o=1&#038;a=0321659570" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</p>
<h2 style="text-align: left;">Extra Books</h2>
<p style="text-align: left;">หนังสือที่แนะนำไปเบื้องต้นผมว่า ครอบคลุมกับ ทุกๆเนื้อหาสำหรับการเขียนโปรแกรมบน Mac , iPhone แล้วนะครับ และสำหรับคนที่สนใจใน เบื้องลึกอื่นๆ ผมยังมีแนะนำอีก</p>
<h2 style="text-align: left;">Mac OS X Internals: A Systems Approach</h2>
<p style="text-align: left;">เล่มนี้เป็นเล่มตำนานเลยก็ว่าได้ เพราะได้เขียนเกี่ยวกับ ระบบ Mac ได้อย่างละเอียดยิบมากๆ ตั้งแต่ระดับ Kernel กันเลยทีเดียว คือถ้าใครสนใจการทำงาน ของระบบ Mac OS X ในแบบลึกซึ้ง เล่มนี้ไม่ผิดหวังแน่ๆครับ</p>
<p style="text-align: center;"><img class="size-medium wp-image-607 aligncenter" title="Mac OS X Internals: A Systems Approach" src="http://www.macfeteria.com/wp-content/uploads/2009/02/internal-214x300.gif" alt="Mac OS X Internals: A Systems Approach" width="214" height="300" /></p>
<p style="text-align: left;">เล่มนี้หนามากๆ ถ้าใครต้องการเขียนโปรแกรมบน Mac แบบลึกๆเล่มนี้ควรจะศึกษาเป็นอย่างยิ่ง</p>
<p style="text-align: left;">รายละเอียดของหนังสือ <a href="http://www.amazon.com/gp/product/0321278542?ie=UTF8&#038;tag=macfeteria-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321278542">Mac OS X Internals: A Systems Approach</a><img src="http://www.assoc-amazon.com/e/ir?t=macfeteria-20&#038;l=as2&#038;o=1&#038;a=0321278542" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</p>
<h2 style="text-align: left;">Programming with Quartz: 2D and PDF Graphics in Mac OS X</h2>
<p style="text-align: left;">สำหรับคนที่ต้องการศึกษา Quartz Framework ( 2D Graphic Library ) เล่มนี้แนะนำเลยครับ เพราะละเอียดมากๆ ตั้งแต่การวาดเส้น ลงสี และรวมไปถึงการใช้งานขั้นสูงเช่น PDF อีกด้วย แต่ไม่มีเนื้อหาเกี่ยวกับ 3D สักเท่าไหร่</p>
<p style="text-align: center;"><img class="size-medium wp-image-608 aligncenter" title="Programming with Quartz: 2D and PDF Graphics in Mac OS X" src="http://www.macfeteria.com/wp-content/uploads/2009/02/quartz-214x300.gif" alt="Programming with Quartz: 2D and PDF Graphics in Mac OS X" width="214" height="300" /></p>
<p style="text-align: left;">ถ้าใครต้องเขียนโปรแกรมจำพวก 3D เล่มนี้ไม่ได้สอน การเขียนโปรแกรมด้วย OpenGL เลย มีแต่ Quartz ล้วนๆ และก็เนื้อหาแบ่งเป็น Carbon กับ Cocoa อย่างละครึ่งๆ แต่หนักไปทาง Carbon ซะมากกว่า</p>
<p style="text-align: left;">รายละเอียดของหนังสือ <a href="http://www.amazon.com/gp/product/0123694736?ie=UTF8&#038;tag=macfeteria-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0123694736">Programming with Quartz: 2D and PDF Graphics in Mac OS X (The Morgan Kaufmann Series in Computer Graphics)</a><img src="http://www.assoc-amazon.com/e/ir?t=macfeteria-20&#038;l=as2&#038;o=1&#038;a=0123694736" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</p>
<h2 style="text-align: left;">Web</h2>
<p style="text-align: left;">และก็ยังมีแหล่งข้อมูลอื่นๆที่แนะนำให้เข้าไปอ่านเพิ่มเติม</p>
<ul>
<li><a href="http://iphonedevcentral.org/">iPhoneDevCentral.org</a> มีหลายๆ Tutorial ให้ได้ดูกัน</li>
<li><a href="http://developer.apple.com/">Apple Developer Center</a> ก็เป็นของ apple เองครับเข้าไปดูพวก example project หรืออ่าน guide ได้</li>
<li><a href="http://icodeblog.com/">icode blog</a> มีหลายๆ tutorial ที่น่าสนใจมากๆ</li>
<li><a href="http://www.stanford.edu/class/cs193p/cgi-bin/index.php">Stanford CS193P Course : Course iPhone Development</a> นี่เป็น course ของมหาวิทยาลัย standford สอนเกี่ยวกับ การเขียนโปรแกรมด้วย iPhone มีทั้ง example ครบเลย สุดยอดมากๆ</li>
</ul>
<p>ถ้าใครมี Link หรือหนังสือแนะนำ ก็ Comment กันเข้ามาครับ</p>
<p>ปล. ขอโทษทีนะครับ ที่ไม่ค่อยได้ update blog สักเท่าไหร่</p>
<p style="text-align: left;">
<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/carbon' rel='tag' target='_self'>carbon</a>, <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/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/stuff' rel='tag' target='_self'>stuff</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/02/22/books-extra-stuffs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objective-C Programmming :Extending Class</title>
		<link>http://www.macfeteria.com/blog/2008/11/04/objective-c-programmming-extending-class/</link>
		<comments>http://www.macfeteria.com/blog/2008/11/04/objective-c-programmming-extending-class/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 07:23:20 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=422</guid>
		<description><![CDATA[ปัญหาอย่างหนึ่งของการใช้ Framework หรือ Library ต่างๆก็คือ เราไม่อาจจะไปแก้ไขหรือเพ่ิมเติม method ต่างๆของ class ได้ เพราะว่าบางครั้ง Lib ที่ได้มานั้นก็มีแต่ lib ที่ผ่านการ compile เป็น binary files และมีแค่ header มาเท่านั้น วิธีการที่่เราจะเพิ่มเติมเข้าไปได้ก็คือ ต้องเขียน subclass ของ class นั้นๆ แต่ในภาษา Objective-C นั้นมีอีกวิธีหนึ่งที่เราสามารถเขียน method เพิ่มเติมเข้าไปยัง class เดิมได้ นั่นก็คือ category สมมติว่าเราต้องการเขียน โปรแกรมที่ต้องการ reverse string บ่อยๆ เราอาจจะเขียน class ขึ้นมาใหม่และเขียน method ที่ชื่อว่า getReverse ขึ้นมา อาจจะเขียนได้ประมาณนี้ ได้ว่า @interface ReverseString:NSObject &#123; NSString* [...]]]></description>
			<content:encoded><![CDATA[<p>ปัญหาอย่างหนึ่งของการใช้ Framework หรือ Library ต่างๆก็คือ เราไม่อาจจะไปแก้ไขหรือเพ่ิมเติม method ต่างๆของ class ได้ เพราะว่าบางครั้ง Lib ที่ได้มานั้นก็มีแต่ lib ที่ผ่านการ compile เป็น binary files และมีแค่ header มาเท่านั้น วิธีการที่่เราจะเพิ่มเติมเข้าไปได้ก็คือ ต้องเขียน subclass ของ class นั้นๆ แต่ในภาษา Objective-C นั้นมีอีกวิธีหนึ่งที่เราสามารถเขียน method เพิ่มเติมเข้าไปยัง class เดิมได้ นั่นก็คือ category</p>
<p>สมมติว่าเราต้องการเขียน โปรแกรมที่ต้องการ reverse string บ่อยๆ เราอาจจะเขียน class ขึ้นมาใหม่และเขียน method ที่ชื่อว่า getReverse ขึ้นมา อาจจะเขียนได้ประมาณนี้ ได้ว่า</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> ReverseString<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> m_text;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setString<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> text;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSMutableString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> getReverse;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>แล้วก็เขียน code ในส่วนของ getReverse ได้ว่า</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> ReverseString
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSMutableString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> getReverse
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>temp <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;">NSMutableString</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span> ;
	unichar c;
	<span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> i <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_text length<span style="color: #002200;">&#93;</span><span style="color: #002200;">-</span><span style="color: #2400d9;">1</span> ; i <span style="color: #002200;">&amp;</span>gt;<span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span> ; i<span style="color: #002200;">--</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		c <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_text characterAtIndex<span style="color: #002200;">:</span>i<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>temp appendString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithCharacters<span style="color: #002200;">:&amp;</span>c length<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	<span style="color: #a61390;">return</span> temp;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>เขียนแบบนี้ก็พอได้ แต่ว่ามันก็มีข้อเสียคือ เมื่อเราต้องการจะ reverse string เราต้องให้ตัวแปร ของเราเป็น ReverseString</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">	ReverseString <span style="color: #002200;">*</span>hello <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>ReverseString alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>hello setString<span style="color: #002200;">:</span>@Hello<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>revHello <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>hello getReverse<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>ซึ่งมันไม่สะดวก วิธีที่ดีกว่านั้นก็อาจจะเขียนเป็น function ขึ้นมาเป็น  global ก็พอได้</p>
<p>แต่ถ้าหากเราอยากจะทำให้ NSMutableString มี method ที่ชื่อว่า getReverse เลยจะทำได้ไม๊ ?<br />
คำตอบก็คือ ทำได้</p>
<p>Category นั้นทำให้เราสามารถที่จะเพิ่ม method ต่างๆเข้าไปยัง class ที่มีอยู่เดิมที่เราไม่สามารถจะไปแก้ไขในส่วนของ source ได้ แต่ Category ก็ไม่ได้สิทธิมากขนาดที่จะไปเพิ่ม member ใน Class ได้ เรามาลองดูการใช้ Category เลยอาจจะเข้าใจง่ายกว่า</p>
<p>จากตัวอย่างข้างบนนั้นถ้าหากเราต้องการจะเขียนให้  NSMutableString มี method นั้นเราก็ต้องเขียน category ขึ้นมาวิธีการ ก็สุดแสนจะง่ายดายเพียงแค่ โดยมีรูปแบบดังนี้</p>
<p>@interface ClassName ( CategoryName )</p>
<p>เอาละมาดูของจริงกันเลยดีกว่า ก่อนอื่นเราก็ประกาศ Category ที่ชื่อว่า MyExtend โดยเราจะเพิ่มเติมขยายในส่วนของ NSMutableString และเราก็เขียน method ใหม่ที่ชื่อว่า getReverse</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// MyString.h</span>
<span style="color: #a61390;">@interface</span> <span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">&#40;</span>MyExtend<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSMutableString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> getReverse;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>หลังจากนั้นก็เขียน ในส่วนของ source ได้แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// MyString.m</span>
<span style="color: #a61390;">@implementation</span> <span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">&#40;</span>MyExtend<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSMutableString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> getReverse
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>temp <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;">NSMutableString</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span> ;
	unichar c;
	<span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> i <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self length<span style="color: #002200;">&#93;</span><span style="color: #002200;">-</span><span style="color: #2400d9;">1</span> ; i <span style="color: #002200;">&amp;</span>gt;<span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span> ; i<span style="color: #002200;">--</span> <span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		c <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self characterAtIndex<span style="color: #002200;">:</span>i<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>temp appendString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithCharacters<span style="color: #002200;">:&amp;</span>c length<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	<span style="color: #a61390;">return</span> temp;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>เพียงแค่เท่านี้ก็เสร็จเรียบร้อย หลังจากนั้นแล้ว NSMutableString ของเราก็จะมี method ใหม่ที่ชื่อว่า getReverse เรียบร้อยแล้ว</p>
<p>การเรียกใช้ก็ไม่ได้ยาก ดังตัวอย่าง</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;MyString.h&quot;</span>
&nbsp;
<span style="color: #a61390;">int</span> main <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> argc, <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span> argv<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSAutoreleasePool</span> <span style="color: #002200;">*</span> pool <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAutoreleasePool</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello&quot;</span>;
&nbsp;
	NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&quot;</span>,<span style="color: #002200;">&#91;</span>text getReverse<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#91;</span>pool drain<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">return</span> <span style="color: #2400d9;">0</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>และนอกจากนี้เรายังสามารถใช้ category เพื่อทำเป็น private method ได้ด้วย สมมติว่าเรามี Class ง่ายๆแบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//AA.h</span>
<span style="color: #a61390;">@interface</span> AA <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> getSomeInt;
<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: #11740a; font-style: italic;">//AA.m</span>
<span style="color: #a61390;">@implementation</span> AA 
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> getSomeInt
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #2400d9;">10</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จะเห็นว่า  AA นั้นมี getSomeInt ซึ่งเป็น public method และในกรณีที่เราอยากให้มันเป็น private เราอาจจะดัดแปลงได้โดยการใช้ category ได้แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//AA.m</span>
<span style="color: #a61390;">@interface</span> AA<span style="color: #002200;">&#40;</span>hidden<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> getHiddenInt;
<span style="color: #a61390;">@end</span>
&nbsp;
<span style="color: #a61390;">@implementation</span><span style="color: #002200;">&#40;</span>hidden<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> getHiddenInt
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #2400d9;">20</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> AA 
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> getSomeInt
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #2400d9;">10</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>เป็นไงบ้างครับสำหรับการใช้ category จะเห็นว่ามันมีประโยชน์มากๆเลยสำหรับการขยายคลาส</p>

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

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/class' rel='tag' target='_self'>class</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></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2008/11/04/objective-c-programmming-extending-class/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objective-C 2.0 Programming : Property</title>
		<link>http://www.macfeteria.com/blog/2008/10/22/objective-c-programming-property/</link>
		<comments>http://www.macfeteria.com/blog/2008/10/22/objective-c-programming-property/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 08:44:25 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=414</guid>
		<description><![CDATA[ถ้าหลังจากที่ได้เขียนเกี่ยวกับ ภาษา Objective-c มาล้วนๆ และก็ได้พอขึ้น cocoa กับ iphone ไปบ้าง แต่ว่ามันก็ยังมีบางเรื่องที่ผมคิดว่า ต้องเขียนก่อน นั่นก็คือ Objective C 2.0 นั่นเอง Objective-C 2.0 ต่างจาก Objective-C หรือเปล่า ? คำตอบก็คือ มันก็ไม่ได้ต่างหรอกครับ เพียงแค่เค้าเพิ่มบางอย่างในตัวภาษาเข้ามา อาทิเช่น Garbage Collection อะไรแบบนี้เป็นต้น ฉนั้นแล้วก็ไม่ต้องไปกังวล ว่านี่ต้องศึกษาใหม่เลยหรือเปล่า และในวันนี้ผมจะ เริ่มด้วย คุณสมบัติใหม่ๆที่เพิ่มเข้ามาของ objective-c 2.0 ซึ่งมันจะช่วยอำนวยความสะดวกมากๆ ต่อการเขียนโปรแกรม งั้นเรามาเริ่มเลยดีกว่า @property เป็นคุณสมบัติที่เพิ่มเข้ามาใน objective-c 2.0 นี้ โดยปกติแล้ว เมื่อเราประกาศ member ใน class แล้วเราก็มักจะมี Function Get/Set กับตัวแปรนั้นๆเช่นว่า // Student.h [...]]]></description>
			<content:encoded><![CDATA[<p>ถ้าหลังจากที่ได้เขียนเกี่ยวกับ ภาษา Objective-c มาล้วนๆ และก็ได้พอขึ้น cocoa กับ iphone ไปบ้าง แต่ว่ามันก็ยังมีบางเรื่องที่ผมคิดว่า ต้องเขียนก่อน นั่นก็คือ Objective C 2.0 นั่นเอง</p>
<h3>Objective-C 2.0 ต่างจาก Objective-C หรือเปล่า ?</h3>
<p>คำตอบก็คือ มันก็ไม่ได้ต่างหรอกครับ เพียงแค่เค้าเพิ่มบางอย่างในตัวภาษาเข้ามา อาทิเช่น Garbage Collection อะไรแบบนี้เป็นต้น ฉนั้นแล้วก็ไม่ต้องไปกังวล ว่านี่ต้องศึกษาใหม่เลยหรือเปล่า และในวันนี้ผมจะ เริ่มด้วย คุณสมบัติใหม่ๆที่เพิ่มเข้ามาของ objective-c 2.0 ซึ่งมันจะช่วยอำนวยความสะดวกมากๆ ต่อการเขียนโปรแกรม งั้นเรามาเริ่มเลยดีกว่า</p>
<h2>@property</h2>
<p>เป็นคุณสมบัติที่เพิ่มเข้ามาใน objective-c 2.0 นี้ โดยปกติแล้ว เมื่อเราประกาศ member ใน class แล้วเราก็มักจะมี Function Get/Set กับตัวแปรนั้นๆเช่นว่า</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Student.h</span>
<span style="color: #a61390;">@interface</span> Student <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">int</span> score;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> getScore;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setScore<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> n;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ส่วนตัว source file  ก็เขียนได้ว่า</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// Student.m</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> Student
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> getScore
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> score;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setScore<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> n
<span style="color: #002200;">&#123;</span>
	score <span style="color: #002200;">=</span> n;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ในตัวโปรแกรมอาจจะมีการเรียกใช้ เช่น</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">x <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>student getScore<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>student setScore<span style="color: #002200;">:</span><span style="color: #2400d9;">80</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>จะเห็นว่า ยังไงเราก็ไม่สามารถเข้าไปใช้ score ได้ตรงๆ ต้องเรียกผ่าน getScore / setScore แต่ใน objective-c 2.0 นั้นเราไม่จำเป็นต้องเขียน set/get ก็ได้ โดยสิ่งที่เราจะทำก็คือ ทำให้ score นั้นเป็น property ของ class-Student ซะเลย</p>
<p>วิธีการก็ไม่ได้ยากเย็นอะไรนัก สิ่งที่ต้องทำก็คือ บอกว่า member นั้นเป็น property ดังตัวอย่าง code ข้างล่างนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> Student <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">int</span> score;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>assign<span style="color: #002200;">&#41;</span> <span style="color: #a61390;">int</span> score;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ส่วนของ code เราก็เพียงแค่เขียน synthesize เข้ามา</p>

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

<p>เพียงเท่านี้ก็เรียบร้อย ส่วนวิธีการก็คือ เรียกผ่านเครื่งหมาย &#8220;.&#8221; เช่นตัวอย่างแบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">x <span style="color: #002200;">=</span> student.score;
student.score <span style="color: #002200;">=</span> <span style="color: #2400d9;">40</span>;</pre></div></div>

<p>จะเห็นว่ามันช่วยลดการเขียน set/get ลงไปได้เยอะเลย ลองนึกว่า หาเรามี member สัก 20 ตัวและต้องเขียน set/get นี่ก็คงต้องเขียนทั้งหมด 40 method เลยทีเดียว</p>
<h2>Attributes</h2>
<p>จาก  code ที่ผ่านมาจะเห็นว่า เราได้เขียน property กันไปแล้ว จะเห็นว่ามี keyword &#8211; assign อยู่ เช่น</p>
<p>@property (assign) int a;</p>
<p>keyword  เหล่านี้เป็นตัวกำหนดลักษณะของ property ต่างๆว่ามีลักษณะเช่นไร และลักษณะต่างๆ ก็แบ่งออกได้เป็น</p>
<h3>Setter Attribute ได้แก่</h3>
<ul>
<li>assign<br />
โดยปกติแล้วจะถูกกำหนดมาให้เป็น default อยู่แล้ว</li>
<li>retain<br />
จะทำการ release ค่าที่เก็บไว้ก่อน แล้วหลังจากนั้นจะ retain ค่าใหม่</li>
<li>copy<br />
จะทำการ release ค่าที่เก็บไว้ก่อน แล้วหลัวจากนั้นจะ copy ค่าใหม่เข้ามา โดยปกตินิยมใช้กับ string</li>
</ul>
<p>เราอาจจะไม่กำหนด attribute แต่ถ้าหากว่าเราไม่ได้ใช้งาน Garbage Collection นั้นเราต้องเลือกใช้อย่างใดอย่างหนึ่ง</p>
<h3>Writability Attribute</h3>
<ul>
<li>readonly<br />
ถ้าหากเรากำหนดเป็นแบบนี้ ตัว compiler จะไม่สร้าง setter ให้เรา</li>
<li>readwrite</li>
</ul>
<p>วิธีการใช้ก็คือ ใช้เครื่องหมาย &#8220;,&#8221; คั่น ระหว่าง attribute ต่างๆเช่น</p>
<p>@property (assign,readonly) int a;</p>
<h3>Atomic Attribute</h3>
<ul>
<li>nonatomic<br />
โดยปกติจะเป็น atomic</li>
</ul>
<p>แล้ว atomic กับ nonatomic ต่างกันยังไง ?<br />
ถ้าหากเป็น atomic นั้นแต่ละ Thread จะเข้าไปเปลี่ยน ค่าใน property พร้อมๆกันไม่ได้ เพราะว่าจะทำการ Lock ค่าไว้และเมื่อเปลี่ยนแปลงค่าเสร็จเรียบร้อยแล้วถึงจะ Unlock ให้ thread อื่นเข้าไปใช้ ก็ถ้าเราใช้ nonatomic ก็จะไม่มีการ lock</p>
<h2>@synthesize @dynamic</h2>
<p>โดยปกติแล้วเราจะใช้ synthesize เพราะว่ามันจัดการ เขียน setter/getter ให้เรา แต่เรายังอาจจะเขียน setter/getter เองก็ได้ วิธีการก็คิือ ใช้ @dynamic แทน โดยลักษณะของ code จะเป็นประมาณนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// ClassA.h</span>
&nbsp;
<span style="color: #a61390;">@interface</span> ClassA <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>dynamicValue;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>synthesizeValue;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>copy, readwrite<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>dynamicValue;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>assign<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span> synthesizeValue;
<span style="color: #a61390;">@end</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">// ClassA.m</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> ClassA
@dynamic dynamicValue;
<span style="color: #a61390;">@synthesize</span> synthesizeValue;
&nbsp;
<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>dynamicValue
<span style="color: #002200;">&#123;</span>
    	<span style="color: #a61390;">return</span> dynamicValue;
<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>setdynamicValue<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>newValue
<span style="color: #002200;">&#123;</span>
    	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>newValue <span style="color: #002200;">!=</span> dynamicValue<span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
        		dynamicValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>newValue copy<span style="color: #002200;">&#93;</span>;
    	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>ครั้งหน้ามาต่อด้วย Objective-C 2.0 อีกครั้ง</p>

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

<p class='technorati-tags'>Technorati Tags: <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></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2008/10/22/objective-c-programming-property/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cocoa Programming III : Key Value</title>
		<link>http://www.macfeteria.com/blog/2008/08/18/cocoa-programming-iii-key-value/</link>
		<comments>http://www.macfeteria.com/blog/2008/08/18/cocoa-programming-iii-key-value/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 15:40:13 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=304</guid>
		<description><![CDATA[Key Value Coding โดยปกติแล้วเราสามารถใช้ method ที่ชื่อว่า setValue:forKey: เพื่อทำการ set ค่าให้กับ ตัวแปรใน class ได้ดังตัวอย่างข้างล่างนี้ สมมติว่าเรามี Class แบบนี้ @interface Book : NSObject &#123; NSString *name; &#125; @end เราสามารถที่จะ set ค่าให้กับ name ได้แบบนี้ book = &#91;&#91;Book alloc&#93;init&#93;; &#91;book setValue:@&#34;FHM&#34; forKey:@&#34;name&#34;&#93;; และเราก็สารมารถที่จะ get ค่าจาก name ได้แบบนี้ NSString *bookName = &#91;book valueForKey:@&#34;name&#34;&#93;; ดูแบบนี้อาจจะเหมือนว่ามันไม่ค่อยจะมีประโยชน์มากนัก แต่เราจะได้ใช้ในเรื่องของ Binding ในส่วนต่อไป Accessor Method มันก็คือ method [...]]]></description>
			<content:encoded><![CDATA[<h2>Key Value Coding</h2>
<p>โดยปกติแล้วเราสามารถใช้ method ที่ชื่อว่า setValue:forKey: เพื่อทำการ set ค่าให้กับ ตัวแปรใน class ได้ดังตัวอย่างข้างล่างนี้</p>
<p>สมมติว่าเรามี Class แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> Book <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>name;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>เราสามารถที่จะ set ค่าให้กับ name ได้แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">book <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>Book alloc<span style="color: #002200;">&#93;</span>init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>book setValue<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;FHM&quot;</span> forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;name&quot;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>และเราก็สารมารถที่จะ get ค่าจาก name ได้แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>bookName <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>book valueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;name&quot;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>ดูแบบนี้อาจจะเหมือนว่ามันไม่ค่อยจะมีประโยชน์มากนัก แต่เราจะได้ใช้ในเรื่องของ Binding ในส่วนต่อไป</p>
<h2>Accessor Method</h2>
<p>มันก็คือ method ที่เป็นลักษณะ Get &#8211; Set นั่นเหละครับ ถ้าหากเรามี class book แบบข้างบน เราอาจจะเขียน accessor 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: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> getName
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> name;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setName<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> n
<span style="color: #002200;">&#123;</span>
	name <span style="color: #002200;">=</span> n;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>โดยปกติแล้ว accessor method นั้นจะมี pattern ลักษณะ<br />
-&lt;Key&gt;<br />
-set&lt;Key&gt;<br />
-get&lt;Key&gt;</p>
<p>รายละเอียดเพิ่มเติมของ pattern อ่านได้ที่ <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/AccessorConventions.html#//apple_ref/doc/uid/20002174">http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/AccessorConventions.html#//apple_ref/doc/uid/20002174</a></p>
<p>คือถ้าหากว่าเราเขียน method ที่มีการทำงานเหมือนกันแต่ว่า มันไม่ตรงกับ pattern ก็ไม่อาจจะเรียกได้ว่าเป็น accessor 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> setBookName<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> n
<span style="color: #002200;">&#123;</span>
	name <span style="color: #002200;">=</span> n;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>คือเรามองว่าจาก setBookName นั้นประกอบไปด้วย &#8220;set&#8221; และ &#8220;BookName&#8221; ซึ่ง BookName ถือว่าเป็น key และใน class book นั้นก็ไม่ได้มี member ที่ชื่อ BookName ดังนั้น method นี้ก็ไม่อาจจะเรียกว่าเป็น acessor method ได้</p>
<h2>Binding</h2>
<p>binding คือการจับคู่ระหว่าง object กับตัวอ้างอิง และใน cocoa เองก็มีการใช้ binding กับ graphic object มากมาย ยกตัวอย่างเช่นว่า เราอาจจะ binding ค่าของตำแหน่งของ slide กับตัวแปร slidePosition เมื่อเราเลื่อน slide ค่าของ slidePostion ก็เปลี่ยนไปตามตำแหน่งของ slide เป็นต้น</p>
<p>อาจจะมองไม่ค่อยจะเห็นภาพว่าเราจะใช้ Binding ได้ยังไง และจะนำ key-value-coding ไปใช้ได้ยังไง งั้นมาดูตัวอย่างการใช้งานจริงๆกันเลยดีกว่า</p>
<p>สมมติว่าเราต้องการเขียนโปรแกรม นับจำนวนของคำ เหมือนดังตัวอย่างแรกๆ แต่ครั้งนี้เราจะใช้ Binding เข้ามาช่วย</p>
<p>ก่อนอื่นก็สร้าง โปรเจคขึ้นมา แล้วก็ add class ที่ชื่อว่า AppController เหมือนที่ผ่านมาในตัวอย่างก่อนๆ โดยใน AppController ของเราจะมี code ดังนี้<span id="more-304"></span></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import </span>
&nbsp;
<span style="color: #a61390;">@interface</span> AppController <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
	IBOutlet <span style="color: #400080;">NSTextField</span> <span style="color: #002200;">*</span>m_textFieldInput;
	IBOutlet <span style="color: #400080;">NSTextField</span> <span style="color: #002200;">*</span>m_textFieldCounter;
&nbsp;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>myText;
<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> setMyText<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> text;
<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> getMyText;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ก็จะเห็นว่า เราแทบจะไม่มีอะไรเลยนอกจาก NSTextField 2 ตัวและ 2 method และส่วน implement ก็เขียนได้แบบนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> AppController
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setMyText<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> text
<span style="color: #002200;">&#123;</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>text length<span style="color: #002200;">&#93;</span> <span style="color: #002200;">!=</span> <span style="color: #2400d9;">0</span> <span style="color: #002200;">&#41;</span>
  <span style="color: #002200;">&#123;</span>
	myText <span style="color: #002200;">=</span> text;
	<span style="color: #002200;">&#91;</span>m_textFieldCounter setIntValue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>myText length<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#93;</span>;
  <span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</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> getMyText
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> myText;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จาก code ข้างบนก็เพียงแค่ setMyText จะไปนับจำนวนของ myText แล้วก็แสดงผลออกมาเท่านั้นเอง</p>
<p>ต่อไปเราก็สร้าง interface ของเราให้มีลักษณะแบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/interface.png" rel="lightbox[304]"><img class="size-medium wp-image-308 aligncenter" title="interface" src="http://www.macfeteria.com/wp-content/uploads/2008/08/interface-300x117.png" alt="" width="300" height="117" /></a></p>
<p style="text-align: left;">และเราก็ สร้าง instance ของ App Controller และ link กันเหมือนเดิม ( ดังรูปข้างล่าง )<br />
link ให้ครบทั้ง 2 NSTextField เลย</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/link_object.png" rel="lightbox[304]"><img class="size-medium wp-image-309 aligncenter" title="link_object" src="http://www.macfeteria.com/wp-content/uploads/2008/08/link_object-300x140.png" alt="" width="300" height="140" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;"><span style="color: #ff6600;">และที่สำคัญมากๆ</span> เราต้องมา set binding ตรง inspector แบบรูปข้างล่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/binding.png" rel="lightbox[304]"><img class="size-medium wp-image-310 aligncenter" title="binding" src="http://www.macfeteria.com/wp-content/uploads/2008/08/binding-300x132.png" alt="" width="300" height="132" /></a></p>
<p style="text-align: left;">สิ่งที่เราต้องทำก็คือ Bind to: ให้ set เป็น App Controllerและส่วน Model Key Path นั้นเราก็ set ให้เป็น myText เพื่อให้มันตรงกับค่าของ ตัวแปร  myText</p>
<p style="text-align: left;">ลอง Compile &amp; Run ดูครับ แล้วลองพิมพ์ ข้อความลงไป พร้อมกับกด Enter จะเห็นว่า ตรง Label ก็จะเปลี่ยนเป็นจำนวนตัวอักษรที่เราพิมพ์ลงไป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/result1.png" rel="lightbox[304]"><img class="size-medium wp-image-313 aligncenter" title="result1" src="http://www.macfeteria.com/wp-content/uploads/2008/08/result1-300x117.png" alt="" width="300" height="117" /></a></p>
<p style="text-align: left;">จะเห็นว่า เราแทบไม่ต้องไปเขียนอะไรเพิ่มเติมเลย เพราะมันเอา key ไป bind ให้เราโดยอัตโนมัติ ถ้าหากเรา debug เวลาที่เราพิมพ์และหลังจาก enter มันก็เข้ามายัง method setMyText ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/debug.png" rel="lightbox[304]"><img class="size-medium wp-image-311 aligncenter" title="debug" src="http://www.macfeteria.com/wp-content/uploads/2008/08/debug-300x127.png" alt="" width="300" height="127" /></a></p>
<p style="text-align: left;">และถ้าหากเราดู Call Stack ก็จะเห็นว่า methode ที่ได้เรียก setMyText นั้นจะมาจาก setValue:forkey อีกที</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/callstack.png" rel="lightbox[304]"><img class="size-medium wp-image-312 aligncenter" title="callstack" src="http://www.macfeteria.com/wp-content/uploads/2008/08/callstack-300x134.png" alt="" width="300" height="134" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">ไม่เข้าใจก็ถามเข้ามาได้ครับ แต่ผมก็รู้สึกได้ว่าเขียนงงๆ ก็เอาเป็นว่ามีคำแนะนำติชม ก็คอมเม้นกันมาครับ</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' rel='tag' target='_self'>cocoa</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></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2008/08/18/cocoa-programming-iii-key-value/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

