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

<channel>
	<title>Macfeteria &#187; cocoa</title>
	<atom:link href="http://www.macfeteria.com/blog/tag/cocoa/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 : II &#8211; Event &amp; Action</title>
		<link>http://www.macfeteria.com/blog/2009/03/11/iphone-programming-ii-event-action/</link>
		<comments>http://www.macfeteria.com/blog/2009/03/11/iphone-programming-ii-event-action/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 12:06:38 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[cocoa touch]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

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

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

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

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

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

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

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

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

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

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/03/11/iphone-programming-ii-event-action/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>iPhone Programming I : Start Again</title>
		<link>http://www.macfeteria.com/blog/2009/02/28/iphone-programming-i-start-again/</link>
		<comments>http://www.macfeteria.com/blog/2009/02/28/iphone-programming-i-start-again/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 07:12:46 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[xcode]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=694</guid>
		<description><![CDATA[หลังจากที่ได้ทดลองเขียน iphone กันไปแบบมั่วๆแล้ว จาก tutorial ที่ผ่านๆมา และวันนี้เราน่าจะได้รู้เกี่ยวกับ iPhone SDK กันก่อนสักนิด ว่า Cocoa Touch ที่ใช้เขียนกันนั้น มันต่างจาก Cocoa ปกติอย่างไร และก็เรื่องเล็กๆน้อยๆ เกี่ยวกับ iPhone Project รวมถึง Tools ต่างๆ Cocoa &#38; Cocoa Touch อย่างที่ผมได้บอกไปแล้วว่า ถ้าหากเราต้องเขียนโปรแกรมด้วย Objective-C แล้วนั่นก็หมายถึงว่าเราต้องเขียนด้วย Cocoa Framework และถ้าเป็น iPhone ก็จะเป็น Cocoa Touch ซึ่งเป็น Framework ขนาดเล็กกว่าและเพิ่มเติมในบางส่วน สิ่งที่ควรจะรู้เกี่ยวกับ iPhone และ Cocoa Touch นั้นก็คือ iPhone นั้นสามารถใช้งานได้เพียง 1 โปรแกรม iPhone มีหน้าขนาดหน้าจอที่จำกัด เราไม่สามารถเข้าไปใช้ [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจากที่ได้ทดลองเขียน iphone กันไปแบบมั่วๆแล้ว จาก tutorial ที่ผ่านๆมา และวันนี้เราน่าจะได้รู้เกี่ยวกับ iPhone SDK กันก่อนสักนิด ว่า Cocoa Touch ที่ใช้เขียนกันนั้น มันต่างจาก Cocoa ปกติอย่างไร และก็เรื่องเล็กๆน้อยๆ เกี่ยวกับ iPhone Project รวมถึง Tools ต่างๆ</p>
<h2>Cocoa &amp; Cocoa Touch</h2>
<p>อย่างที่ผมได้บอกไปแล้วว่า ถ้าหากเราต้องเขียนโปรแกรมด้วย Objective-C แล้วนั่นก็หมายถึงว่าเราต้องเขียนด้วย Cocoa Framework และถ้าเป็น iPhone ก็จะเป็น Cocoa Touch ซึ่งเป็น Framework ขนาดเล็กกว่าและเพิ่มเติมในบางส่วน สิ่งที่ควรจะรู้เกี่ยวกับ iPhone และ Cocoa Touch นั้นก็คือ</p>
<ul>
<li>iPhone นั้นสามารถใช้งานได้เพียง 1 โปรแกรม</li>
<li>iPhone มีหน้าขนาดหน้าจอที่จำกัด</li>
<li>เราไม่สามารถเข้าไปใช้ File ของ App ตัวอื่นๆได้นอกจาก App ของมันเอง</li>
<li>Cocoa Touch ไม่มี Garbage Collection</li>
<li>Cocoa Touch ไม่มี Binding</li>
<li>Cocoa Touch ไม่มี Core Data ( ตอนนี้มีใน SDK 3.0 แล้ว ) </li>
<li>iPhone มีทรัพยากรณ์ที่จำกัด ram , diskspace , cpu</li>
</ul>
<h2>New Project</h2>
<p>อย่างที่ได้บอกไปว่า ครั้งก่อนผมได้ทดลองเขียน iPhone กันแบบมั่วๆไป และครั้งนี้เราจะมาทำความเข้าใจเกี่ยวกับ iPhone Project กันมากขึ้น โดยเริ่มจาก การสร้างโปรเจคกันเลย ถ้าหากเราเปิด Xcode ขึ้นมาและเริ่มสร้างโปรเจค จะพบว่า มีหลายๆ Template ให้เลือก ดังรูปภาพ</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/project.png" rel="lightbox[694]"><img class="size-medium wp-image-695 aligncenter" title="project" src="http://www.macfeteria.com/wp-content/uploads/2009/02/project-300x293.png" alt="project" width="300" height="293" /></a></p>
<p>แต่ละโปรเจคนั้นก็จะมีรายละเอียดต่างๆ ดังนี้</p>
<ul>
<li>Navigation-Based Application<br />
ก็แปลตรงตัวเลยครับคือ เป็นโปรเจคที่แสดงในรูปแบบ Navigation ( จะเป็นลักษณะ Heirachy คือมีลำดับ )</li>
<li>OpenGL ES Application<br />
แบบนี้ก็ใช้เขียน Appplication จำพวก Game</li>
<li>Tab Bar Application<br />
โปรเจคแบบนี้จะมี Tab เป็นตัวเปลี่ยนหน้าต่างไปมา โดยไม่ได้เรียงลำดับเหมือน Navigation</li>
<li>Utility Application</li>
<li>View-Based Application<br />
แบบนี้เป็นโปรเจคที่มี view เพียงอันเดียว <span style="text-decoration: underline;">** โดยส่วนมากใน tutorial ผมจะใช้อันนี้ **</span></li>
<li>Window-Based Application<br />
โปรเจคแบบนี้จะเป็นพื้นๆเลยครับ คือมี Application Delegate มาให้แค่นั้นเอง</li>
</ul>
<h2>Files</h2>
<p>เมื่อเราได้สร้างโปรเจคขึ้นมาจะพบว่ามี File ต่างๆมากมายดังที่ผมเคยได้อธิบายไป ใน post ก่อนๆ แต่อาจจะอธิบายขาดหายไปในบางส่วน ครั้งนี้ก็อธิบายให้ครบเลยละกัน</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/xcode_project.png" rel="lightbox[694]"><img class="size-medium wp-image-696 aligncenter" title="xcode_project" src="http://www.macfeteria.com/wp-content/uploads/2009/02/xcode_project-300x212.png" alt="xcode_project" width="300" height="212" /></a></p>
<p>จากรูปข้างบน จะเห็นว่ามี File ต่างๆมากมาย อันได้แก่</p>
<ul>
<li>.m และ .h ไฟล์สองแบบนี้ก็คือ Header กับ Source นั่นเหละครับผมไม่แน่ใจว่า ภาษาอื่นๆ เค้าประกาศ Class กันแบบแยก Header &#8211; Source แบบนี้หรือเปล่า แต่ถ้าเป็น C/C++ ไฟล์จำพวก .h จะเป็น Header เอาไว้ประกาศ Class ส่วน .m และ .c และ .cpp จะเป็น ส่วนของ implement.</li>
<li>.pch เรียกว่า pre compile header ครับไฟล์นี้จะรวมรายชื่อ header ของ framework อื่นๆที่ต้องใช้ในโปรเจคและทำการ pre compile ก่อน เพื่อลดเวลาในการ compile</li>
<li>.framework เป็น Library นั่นเอง</li>
<li>.plist ไฟล์นี้เป็น property list ครับ เก็บค่า property ของ application ของเราเช่น บอกว่า icon ของ app ใช้ resource file ไหน</li>
<li>.xib เป็น interface สำหรับโปรแกรมของเรา</li>
<li>.app  ก็คือตัว Appication ของเรานั่นเหละครับ</li>
</ul>
<h2>Interface Builder</h2>
<p>ทุกครั้งที่เราจะต้องออกแบบหน้าตาโปรแกรมของเรา เราจะใช้ interface builder และแน่นอนว่า File ที่เกี่ยวข้องก็คือ .xib นั่นเอง เว้นแต่ว่าเราจะเขียนโปรแกรมที่ต้องใช้ พวก OpenGL เราก็แทบจะไม่ต้องใช้ interface builder เลย และเมื่อเราได้ double click ที่ .xib ของเราจะเห็นหน้าตาของโปรแกรม interface builder ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/interface_builder.png" rel="lightbox[694]"><img class="size-medium wp-image-698 aligncenter" title="interface_builder" src="http://www.macfeteria.com/wp-content/uploads/2009/02/interface_builder-296x300.png" alt="interface_builder" width="296" height="300" /></a></p>
<p>จริงๆหน้าต่าง ของ interface builder สำหรับ iPhone นั้นก็แทบจะไม่ได้ต่างจาก การเขียน application ปกติสักเท่าไหร่ แต่ถ้าดูดีๆ จะเห็นว่า หน้าต่าง inspector นั้นจะมีแค่ 4 tab เท่านั้นเอง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/inspector.png" rel="lightbox[694]"><img class="size-full wp-image-699 aligncenter" title="inspector" src="http://www.macfeteria.com/wp-content/uploads/2009/02/inspector.png" alt="inspector" width="287" height="250" /></a></p>
<p>นั่นก็คือ Attributes , Size , Connection , Identity ซึ่งจะพบว่าสิ่งที่ขาดไปก็คือ Binding , Effect , ApplcScript</p>
<h2>Xib File</h2>
<p>และถ้าเราดูตรง Document Windows จะเห็นว่า มี Object อยู่สองตัวเสมอๆ คือ File&#8217;s Owner กับ First Responder</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/xib.png" rel="lightbox[694]"><img class="size-medium wp-image-702 aligncenter" title="xib" src="http://www.macfeteria.com/wp-content/uploads/2009/02/xib-275x300.png" alt="xib" width="275" height="300" /></a></p>
<p>ความสำคัญของ Object 2 ตัวนี้ก็คือ</p>
<ul>
<li>File&#8217;s Owner เป็นตัวแสดงถึง Object ที่ได้โหลดไฟล์ Nib ตัวนี้หรือพูออีกอย่างก็คือเป็นเจ้าของ Nib นั่นเอง</li>
<li>First Responder นั้นเป็น เป็น Object ที่จัดการ interaction ของ object ที่กำลังโดนกระทำอยู่ ณ ขณะนั้น คือยกตัวอย่างเช่นถ้าหากเรากำลังพิมพ์ข้อความใน textbox นั่นก็แปลว่า textbox คือ responder นั่นเอง และถ้าหากเราเปลี่ยนไปกดปุ่ม ปุ่มก็จะกลายเป็น  responder แทน และ First Responder  นี้ก็จะช่วยให้โปรแกรมรู้ได้ว่า Object ไหนควรจะถูก responder นั่นเอง</li>
</ul>
<p>เมื่อเราได้สร้างโปรเจคโดยให้ชื่อว่า Test และเลือกแบบ View-Based Application จะเห็นว่ามี .xib ทั้งหมดสอง files ด้วยกัน ( ดูจากรูป ที่ 2 ) นั่นคือ MainWindows.xib กับ TestViewController.xib และถ้าเราเปิด MainWindows.xib ขึ้นมาเลือกไปที่ File&#8217;s Owner จะพบว่า Object ที่โหลด xib ตัวนี้ก็คือ UIApplication ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/mainowner.png" rel="lightbox[694]"><img class="size-medium wp-image-708 aligncenter" title="mainowner" src="http://www.macfeteria.com/wp-content/uploads/2009/02/mainowner-297x300.png" alt="mainowner" width="297" height="300" /></a></p>
<p>และถ้าเรากดดูที่ Test View Controller ( icon ทีเป็นรูป วงกลมแล้วมีสี่เหลี่มตรงกลาง ) ก็จะเห็นหน้าตา interface แบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/maininterface1.png" rel="lightbox[694]"><img class="size-medium wp-image-710 aligncenter" title="maininterface1" src="http://www.macfeteria.com/wp-content/uploads/2009/02/maininterface1-276x300.png" alt="maininterface1" width="276" height="300" /></a></p>
<p>ถ้าหาก เรามาลองเดาจาก interface จะมีข้อความตรงกลางที่เขียนว่า Loaded From &#8220;TestViewController.xib&#8221; ที่เห็นตรงนี้ก็น่าจะพอจะตีความได้ว่า View ที่ Test View Controller ตัวนี้เป็นตัวควบคุม จะต้องไปโหลดจาก TextViewController.xib แน่นอน แล้วเราก็ลองเปิด TestViewController.xib กันขึ้นมาดู แล้วกดไปที่ File&#8217;s Owner</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/viewowner.png" rel="lightbox[694]"><img class="size-medium wp-image-711 aligncenter" title="viewowner" src="http://www.macfeteria.com/wp-content/uploads/2009/02/viewowner-300x273.png" alt="viewowner" width="300" height="273" /></a></p>
<p>จะเห็นได้ว่า File&#8217;s Owner ก็คือ TestViewController นั่นเอง</p>
<p>น่าจะพอเข้าใจ File&#8217;s Owner กันนะครับ สรุปก็คือเป็น Object ที่แสดงว่า ใครเป็นคนโหลด xib ตัวนี้นั่นเอง</p>
<h2>iPhone Simulator</h2>
<p>เมื่อเราได้เขียนโปรแกรมเรียบร้อยแล้ว และทำการ compile ไปแล้วนั้นจะพบว่า Xcode จะเปิด application ตัวใหม่ขึ้นมานั่นก้อคือ iPhone Simulator ตัว simulator นี้ผมคิดว่าเป็น  simulator ที่ดีที่สุดของการพัฒนาโปรแกรมบนมือถือเลยก็ว่าได้ ( ถ้าใครได้ลองเขียนโปรแกรมพวก Symbian จะพบว่าตัว simulator ของมันแย่มากๆ )  เพราะว่ามันแทบจะไม่ต่างอะไรกับของจริงเลย และเรายังสามารถปรับเปลี่ยน Version หรือ จะหมุนซ้าย หมุนขวา หรือแม้กระทั่ง จำลอง Memory Warning ได้ด้วย</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/simulator.png" rel="lightbox[694]"><img class="size-medium wp-image-714 aligncenter" title="simulator" src="http://www.macfeteria.com/wp-content/uploads/2009/02/simulator-300x158.png" alt="simulator" width="300" height="158" /></a></p>
<p>และถ้าเริ่มเขียนโปรแกรมไปเยอะแล้ว ไม่รู้ว่าจะลบโปรแกรมที่เขียนไปได้ยังไง ก็ดูตามรูปได้เลยครับ คือเข้าไปยัง เมนูและเลือก reset</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/reset.png" rel="lightbox[694]"><img class="size-medium wp-image-715 aligncenter" title="reset" src="http://www.macfeteria.com/wp-content/uploads/2009/02/reset-300x195.png" alt="reset" width="300" height="195" /></a></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/iphone' rel='tag' target='_self'>iphone</a>, <a class='technorati-link' href='http://technorati.com/tag/xcode' rel='tag' target='_self'>xcode</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2009/02/28/iphone-programming-i-start-again/feed/</wfw:commentRss>
		<slash:comments>3</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>Cocoa Programming IV : More about &#8211; Binding &amp; Property</title>
		<link>http://www.macfeteria.com/blog/2009/02/25/cocoa-programming-iv-more-about-binding-property/</link>
		<comments>http://www.macfeteria.com/blog/2009/02/25/cocoa-programming-iv-more-about-binding-property/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 09:14:57 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[ojective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=635</guid>
		<description><![CDATA[Technology อย่างหนึ่งของ Cocoa ก็คือการ Binding และในวันนี้ผมจะอธิบาย Cocoa Binding รวมถึงตัวอย่างการใช้งาน แบบง่ายๆ กัน MVC &#8211; Model View Controller โดยปกติแล้วการเขียนโปรแกรมด้วย Cocoa เราจะใช้ MVC ( Model View Controller ) design pattern ในการเขียนโปรแกรมค่อนข้างเยอะมาก อาทิเช่น Bindings , Core Data เป็นต้น เราจะมาทำความเข้าใจกันก่อนว่า MVC คืออะไร Model พูดง่ายๆว่าคือ ข้อมูล อาจจะรวมไปถึงวิธีการเก็บข้อมูลด้วย เช่นเราเขียนโปรแกรมที่ต้องการ เก็บคะแนนวิชาเลขของนักเรียน เราอาจจะมี เขียน Class ขึ้นมาชื่อว่า Student เพื่อเอาไว้เก็บคะแนนและชื่อของนักเรียน View ก็คือส่วนที่เอาไว้ติดต่อผู้ใช้ GUI นั่นเหละครับ ยกตัวอย่างเช่น NSButton เป็นต้น [...]]]></description>
			<content:encoded><![CDATA[<p>Technology อย่างหนึ่งของ Cocoa ก็คือการ Binding และในวันนี้ผมจะอธิบาย Cocoa Binding รวมถึงตัวอย่างการใช้งาน แบบง่ายๆ กัน</p>
<h2>MVC &#8211; Model View Controller</h2>
<p>โดยปกติแล้วการเขียนโปรแกรมด้วย Cocoa เราจะใช้ MVC ( Model View Controller ) design pattern ในการเขียนโปรแกรมค่อนข้างเยอะมาก อาทิเช่น Bindings , Core Data เป็นต้น เราจะมาทำความเข้าใจกันก่อนว่า MVC คืออะไร</p>
<ul>
<li>Model พูดง่ายๆว่าคือ ข้อมูล อาจจะรวมไปถึงวิธีการเก็บข้อมูลด้วย เช่นเราเขียนโปรแกรมที่ต้องการ เก็บคะแนนวิชาเลขของนักเรียน เราอาจจะมี เขียน Class ขึ้นมาชื่อว่า Student เพื่อเอาไว้เก็บคะแนนและชื่อของนักเรียน</li>
<li>View ก็คือส่วนที่เอาไว้ติดต่อผู้ใช้ GUI นั่นเหละครับ ยกตัวอย่างเช่น NSButton เป็นต้น</li>
<li>Controller คือส่วนของการควบคุม หรือส่วนกลางระหว่าง ข้อมูลกับ GUI ยกตัวอย่างเช่น อาจจะเป็น Class ที่มี Method ที่เอาไว้ควบคุมการ add / remove รายชื่อนักเรียนเป็นต้น</li>
</ul>
<p>และในการเขียนโปรแกรมด้วย Cocoa นั้นจะพบว่าเราต้องเขียน Class ในลักษณะ MVC ค่อนข้างเยอะมาก ดังนั้นจึงได้มี Binding เข้ามาเพื่อช่วยให้ลดการเขียน Class จำพวก Controller</p>
<h2>Binding</h2>
<p>จริงๆแล้วผมได้อธิบายไว้ใน <a href="http://www.macfeteria.com/2008/08/cocoa-programming-iii-key-value/">http://www.macfeteria.com/2008/08/cocoa-programming-iii-key-value/</a> แล้วแต่จะขอยกตัวอย่างง่ายๆอีกสักตัวอย่าง เพื่อให้เข้าใจ Binding กันมากขึ้น โดยครั้งนี้เราจะ Binding ให้เข้ากับ Property ของ Class ที่เราได้เขียนไว้</p>
<p>การ Binding คือการที่เรานำ key (หรือตัวแปร) เชื่อมกับค่า attribute ต่างของ Object ที่เอาไว้แสดงผล เช่นสมมติว่า หน้าตาโปรแกรมดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/interface.jpg" rel="lightbox[635]"><img class="size-medium wp-image-640 aligncenter" title="interface" src="http://www.macfeteria.com/wp-content/uploads/2009/02/interface-300x92.jpg" alt="interface" width="300" height="92" /></a></p>
<p style="text-align: left;">เพื่อความเข้าใจ เรามาลองเขียนโปรแกรมทดลองกันเลยดีกว่า โดยเริ่มจาก สร้างโปรเจคขึ้นมา โดยให้ชื่อว่า Binding</p>
<p style="text-align: left;">หลังจากนั้นเราก็ออกแบบหน้าตาโปรแกรมให้มีลักษณะดังกล่าว ต่อไป เพิ่ม class ที่ชื่อว่า AppController เหมือนที่เราเคยทำมาเช่นเดิม</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/project.jpg" rel="lightbox[635]"><img class="size-medium wp-image-641 aligncenter" title="project" src="http://www.macfeteria.com/wp-content/uploads/2009/02/project-300x190.jpg" alt="project" width="300" height="190" /></a></p>
<p style="text-align: left;">ต่อไปเราก็เขียน Code ของ 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>
<span style="color: #a61390;">@interface</span> AppController <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
&nbsp;
<span style="color: #a61390;">int</span> m_position;
IBOutlet <span style="color: #400080;">NSTextField</span> <span style="color: #002200;">*</span>m_text;
IBOutlet <span style="color: #400080;">NSButton</span> <span style="color: #002200;">*</span>m_button;
&nbsp;
<span style="color: #002200;">&#125;</span>
&nbsp;
<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> m_position;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> GetPosition<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>และส่วน Code ของ 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_position;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> GetPosition<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
   <span style="color: #002200;">&#91;</span>m_text setStringValue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span>
           <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Position = %d&quot;</span>,m_position<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จะเห็นว่าตัวอย่างโปรแกรม ก็ทำงานอย่างง่ายๆคือ มี ตัวแปร ที่ชื่อว่า m_position และมี IBOutlet อีกสองอย่างคือ NSButon กับ NSTextFields เท่านั้นเอง ส่วน code ของ implement นั้นก็มีเพียง Function ทีชื่อว่า GetPosition เท่านั้นและหน้าที่ของฟังก์ชั่นนี้ก็ไม่ได้ทำอะไรมาก นอกจาก set ค่า String เข้าไปยัง m_text แค่นั้นเอง</p>
<p>หลังจากนั้นก็เปิด Interface Builder แล้วก็ add  object ของ AppController เข้ามาดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/appcontroller.png" rel="lightbox[635]"><img class="size-medium wp-image-647 aligncenter" title="appcontroller" src="http://www.macfeteria.com/wp-content/uploads/2009/02/appcontroller-300x179.png" alt="appcontroller" width="300" height="179" /></a></p>
<p>ต่อไปคือ การ link NSButton เข้ากับ m_button และ NSTextFields เข้ากับ m_text  เข้ากับ interface เหมือนที่เคยทำมา ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/linkobj.png" rel="lightbox[635]"><img class="size-medium wp-image-646 aligncenter" title="linkobj" src="http://www.macfeteria.com/wp-content/uploads/2009/02/linkobj-300x138.png" alt="linkobj" width="300" height="138" /></a></p>
<p>และก็ link Function ที่เราได้เขียนไว้ นั่นคือ GetPostition เข้ากับ Button เหมือนดังรูปภาพข้างล่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/getposition.png" rel="lightbox[635]"><img class="size-medium wp-image-648 aligncenter" title="getposition" src="http://www.macfeteria.com/wp-content/uploads/2009/02/getposition-300x168.png" alt="getposition" width="300" height="168" /></a></p>
<p>ต่อไปส่วนที่สำคัญมาก ก็คือเราจะ Bind ตัวแปร m_position ให้เข้ากับ ตำแหน่งของ slider วิธีการ ก็ไม่ยากครับ ก็คือเราก็กลับไปที่ Interface Builder แล้วก็เปิด Inspector ขึ้นมา จากนั้นก็เลือกไปที่ Slider ที่เราได้ออกแบบไว้ แล้วเลือกไปที่ Binding Inspector ก็จะเห็น หน้าต่างเหมือนดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/binding.png" rel="lightbox[635]"><img class="size-medium wp-image-649 aligncenter" title="binding" src="http://www.macfeteria.com/wp-content/uploads/2009/02/binding-300x259.png" alt="binding" width="300" height="259" /></a></p>
<p>สิ่งที่จะต้องทำการ setting ก็คือ ในส่วนของ Value เราก็เลือก Bind To: ไปที่ App Controller แล้ว Model Key Path ของเรา ก็ใส่ m_position ลงไป<br />
จากที่เราทำไป ก็เป็นการบอกว่า เราจะ Bind Value ของ Slider ไปยัง App Controller แล้วใช้ Key ที่ชื่อว่า m_position หลังจากนั้นเราก็ ทำการ compile ครับ</p>
<p>จากโปรแกรม เราก็ลองเลื่อนตำแหน่ง ของ Slider ดูแล้วหลังจากนั้น เราก็ กด Get Position ดูครับ จะเห็นว่า position text จะเปลี่ยนค่าไป เหมือนดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/program_a.png" rel="lightbox[635]"><img class="size-medium wp-image-650 aligncenter" title="program_a" src="http://www.macfeteria.com/wp-content/uploads/2009/02/program_a-300x92.png" alt="program_a" width="300" height="92" /></a></p>
<p>จะเห็นว่า เราไม่ต้องไปเขียน Function ใดๆเกี่ยวกับ Slider เลย เพราะเราได้ใช้การ Binding เข้าช่วย ถ้าหากจะพิจารณากันจริงๆแล้ว โปรแกรมทำงานอย่างไร ก็ขออธิบายอย่างง่ายได้ว่า</p>
<ul>
<li>จาก  AppController นั้นจะมีตัวแปร ที่ชื่อ m_position เป็น integer และเราก็ได้กำหนดให้ m_position นี้เป็น properties</li>
<li>ดังนั้นแล้ว เราก็เข้าถึง m_position โดยที่ไม่ต้อง เขียน Getter/Setter</li>
<li>ต่อไปเราก็ทำการ Binding Slider  โดยใช้ m_position เป็น key ดังนั้นเมื่อเราเลื่อน slider มันจะไปเรียก Setter/Getter ของ m_postion</li>
<li>แต่เนื่องจาก m_position ของเราเป็น property เราจึงไม่ต้องเขียน Getter/Setter</li>
</ul>
<p>ถ้าหากเปรียบโปรแกรม ระหว่าง <a href="http://www.macfeteria.com/2008/08/cocoa-programming-iii-key-value/">http://www.macfeteria.com/2008/08/cocoa-programming-iii-key-value/</a> ที่ได้เคยเขียนไป ก็จะเห็นว่าเราไม่ต้องเขียน Getter/Setter</p>
<h2>Key Value Observing</h2>
<p style="text-align: left;">จากโปรแกรม ข้างบน ถ้าหากเรามี method อื่นๆที่ทำการเปลี่ยนแปลงค่าของ m_position โดย method อื่นๆ เช่นสมมติว่าเราเพิ่ม Button ที่ชื่อว่า Increase Position เข้าไปเพื่อเพิ่มค่าของ m_position แล้ว slider จะรู้หรือเปล่า ว่าค่าได้มีการเปลี่ยนแปลง ? คำตอบก็คือ ไม่สามารถรู้ได้ ดังนั้นถ้าหากเราต้องการให้ slider นั้นรู้ว่าได้มีการเปลี่ยนแปลงค่าของ m_position จากส่วนอื่นๆ เราก็จะใช้ Key-Value Observing เข้ามาช่วย</p>
<p style="text-align: left;">สมมติว่าจาก โปรแกรมข้างบน เราได้เพิ่ม ปุ่มกด Increase Position เข้าไปดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/interface2.png" rel="lightbox[635]"><img class="size-medium wp-image-659 aligncenter" title="interface2" src="http://www.macfeteria.com/wp-content/uploads/2009/02/interface2-300x92.png" alt="interface2" width="300" height="92" /></a></p>
<p style="text-align: left;">และเพิ่ม IBAction method เข้าไปที่ AppController ที่มีชื่อว่า IncreasePosition: และเขียน implement ได้ดังนี้</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> IncreasePosition<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>
	m_position<span style="color: #002200;">++</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>และเราก็เชื่อม button ของเราให้เข้ากับ IncreasePosition: ใน interface builder ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/link2.png" rel="lightbox[635]"><img class="size-medium wp-image-661 aligncenter" title="link2" src="http://www.macfeteria.com/wp-content/uploads/2009/02/link2-300x262.png" alt="link2" width="300" height="262" /></a></p>
<p style="text-align: center;">
<p style="text-align: left;">แล้วลอง Compile และ Run ดู หลังจากนั้นก็ลองกด ปุ่ม Increse Position ดูครับ ตามหลักแล้วเมื่อเราเพิ่มค่าของ m_position จากการกดปุ่มที่เราได้เพิ่มเข้าไป slider ก็ควรจะเลื่อนตำแหน่งใช่ไหมครับ เพราะว่าค่าของ m_position ได้เปลี่ยนไป แต่เมื่อเราได้ run ดูจริงๆแล้ว <span style="text-decoration: underline;">จะเห็นว่า ไม่มีอะไรเกิดขึ้นเลย </span>แต่ความจริงแล้วค่าของ m_position ก็ได้เปลี่ยนไปแล้วนะครับ ถ้าหากเราเปิด Console ขึ้นมาก็จะเห็น Log ว่าค่าของ m_position ได้เปลี่ยนเหมือนดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2009/02/result.png" rel="lightbox[635]"><img class="size-medium wp-image-660 aligncenter" title="result" src="http://www.macfeteria.com/wp-content/uploads/2009/02/result-300x151.png" alt="result" width="300" height="151" /></a></p>
<p style="text-align: left;">เอาละ แล้วเราจะทำยังไง ?</p>
<p>สิ่งที่เราต้องเพิ่มเข้าไปก็คือ ต้องทำให้ตัวโปรแกรมและส่วนอื่นๆรู้โดยการใช้ notification วิธีการก็ไม่ยากครับ เราเพียงแค่ เพิ่ม code เข้าไปแบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> IncreasePosition<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>self willChangeValueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;m_position&quot;</span><span style="color: #002200;">&#93;</span>;
	m_position<span style="color: #002200;">++</span>;
	<span style="color: #002200;">&#91;</span>self didChangeValueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;m_position&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>เพียงเท่านี้ก็เป็นอันเสร็จ เราลองกด Increase Position ใหม่อีกครั้ง จะเห็นว่า ตำแหน่งของ slider ก็ได้เปลี่ยนไปด้วย หรือเราอาจจะเขียนได้อีกรูปแบบคือ</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> IncreasePosition<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>self setM_position<span style="color: #002200;">:</span> m_position<span style="color: #002200;">+</span><span style="color: #2400d9;">1</span> <span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>ก็ใช้งานได้เหมือนกัน เพียงแต่เราได้ใช้ Key Value เข้ามาช่วย และในครั้งหน้าเดี๋ยวเราจะได้ใช้ Binding กับ Array Controller ครับ</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/ojective-c' rel='tag' target='_self'>ojective-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/25/cocoa-programming-iv-more-about-binding-property/feed/</wfw:commentRss>
		<slash:comments>2</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>iPhone Programming &#8211; Begin</title>
		<link>http://www.macfeteria.com/blog/2008/09/08/iphone-programming-begin/</link>
		<comments>http://www.macfeteria.com/blog/2008/09/08/iphone-programming-begin/#comments</comments>
		<pubDate>Sun, 07 Sep 2008 19:23:01 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=374</guid>
		<description><![CDATA[บทความนี้เขียนโดยสมมติว่าคุณรู้เรื่อง Cocoa มาบ้าง เอาละ ไหนๆ ก็รับปากว่าจะเขียน iPhone Tutorial ไปแล้ว จะเบี้ยวก็กะไร ก่อนอื่นก็บอกก่อนว่า โปรแกรมแรกที่เราจะเขียนนั้นคือ โปรแกรม นับจำนวนตัวอักษร ( คุ้นๆม่ะ ) มันก็โปรแกรม แรกที่ได้เขียน cocoa นั่นเหละ แต่วันนี้เราจะมาลองเขียนสำหรับ iPhone กัน ต้องขอออกตัวก่อนเลยนะครับว่า นี่เป็นการเขียน แบบทดลองเขียน สำหรับตัวผมเองก็เพิ่งจะเริ่มศึกษาเหมือนกัน แต่คิดว่า มันน่าจะเป็น Tutorial ทำให้คนที่ยังไม่รู้จะเริ่มยังไง พอจะจับทิศทางได้ว่า จะศึกษาอะไรก่อน เอาละก่อนอื่น สำหรับคนที่ไม่รู้เรื่อง Cocoa มาก่อนแนะนำว่า ควรไปศึกษามาก่อน เพื่อเป็นการไม่เสียเวลา มาเริ่มกันเลย First Step ก่อนอื่นก็เปิดโปรแกรม XCode ขึ้นมาแล้วก็สร้างโปรเจค Cocoa Touch Application ดังรูป ก็เหมือนๆกับ สร้าง Cocoa Application นั่นเหละครับ [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff6600;">บทความนี้เขียนโดยสมมติว่าคุณรู้เรื่อง Cocoa มาบ้าง</span></p>
<p>เอาละ ไหนๆ ก็รับปากว่าจะเขียน iPhone Tutorial ไปแล้ว จะเบี้ยวก็กะไร ก่อนอื่นก็บอกก่อนว่า โปรแกรมแรกที่เราจะเขียนนั้นคือ โปรแกรม นับจำนวนตัวอักษร ( คุ้นๆม่ะ ) มันก็โปรแกรม แรกที่ได้เขียน cocoa นั่นเหละ แต่วันนี้เราจะมาลองเขียนสำหรับ iPhone กัน ต้องขอออกตัวก่อนเลยนะครับว่า นี่เป็นการเขียน แบบทดลองเขียน สำหรับตัวผมเองก็เพิ่งจะเริ่มศึกษาเหมือนกัน แต่คิดว่า มันน่าจะเป็น Tutorial ทำให้คนที่ยังไม่รู้จะเริ่มยังไง พอจะจับทิศทางได้ว่า จะศึกษาอะไรก่อน</p>
<p>เอาละก่อนอื่น สำหรับคนที่ไม่รู้เรื่อง Cocoa มาก่อนแนะนำว่า ควรไปศึกษามาก่อน</p>
<p>เพื่อเป็นการไม่เสียเวลา มาเริ่มกันเลย</p>
<h2>First Step</h2>
<p>ก่อนอื่นก็เปิดโปรแกรม XCode ขึ้นมาแล้วก็สร้างโปรเจค Cocoa Touch Application ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/new-project.png" rel="lightbox[374]"><img class="size-medium wp-image-380 aligncenter" title="new-project" src="http://www.macfeteria.com/wp-content/uploads/2008/09/new-project-300x244.png" alt="" width="300" height="244" /></a></p>
<p>ก็เหมือนๆกับ สร้าง Cocoa Application นั่นเหละครับ โดยในตัวอย่างผมตั้งชื่อว่า iPhoneStringCount</p>
<p>หลังจากนั้นก็จะเห็น File หลายๆไฟล์ ก็จะแบ่งออกง่ายๆ เป็น</p>
<ol>
<li>iPhoneStringCountAppDelegate</li>
<li>iPhoneStringCountViewController</li>
</ol>
<p>และก็จะเห็นว่ามี xib  ไฟล์ 2 Files นั่นคือ</p>
<ol>
<li>MainMenu.xib และ</li>
<li> iPhoneStringCountViewController.xib</li>
</ol>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/file.png" rel="lightbox[374]"><img class="size-medium wp-image-381 aligncenter" title="file" src="http://www.macfeteria.com/wp-content/uploads/2008/09/file-253x300.png" alt="" width="253" height="300" /></a></p>
<p>คำถามคือว่า 2 xib นี้มันต่างกันยังไง ?<br />
ก็ง่ายๆเลยครับคือว่า MainMenu.xib ก็คือ ตัวหลักของ interface หลักของโปรแกรม เป็นตัวจัดการ view ย่อยๆที่อยู่ในโปรแกรมของเรา ถ้าเปิดมาดูจะเห็น Object ต่างๆในรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/mainxib.png" rel="lightbox[374]"><img class="size-medium wp-image-394 aligncenter" title="mainxib" src="http://www.macfeteria.com/wp-content/uploads/2008/09/mainxib-300x148.png" alt="" width="300" height="148" /></a></p>
<p>ซึ่งจะเห็นว่ามี UIViewController ที่ชื่อว่า &#8220;iPhone String Count View Controller&#8221; ก็สรุปว่า MainMenu.xib  นี้ก็ไม่ต้องไปแก้ไขอะไร</p>
<p>สิ่งที่เราจะออกแบบก็คือ view ย่อยๆนั่นเอง ซึ่งในโปรเจคนี้ก็คือ iPhoneStringCountViewController.xib ก็เปิดไฟล์นี้ขึ้นมา ก็จะเห็นหน้าตา interface builder แบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/iphoneviewxib.png" rel="lightbox[374]"><img class="size-medium wp-image-382 aligncenter" title="iphoneviewxib" src="http://www.macfeteria.com/wp-content/uploads/2008/09/iphoneviewxib-300x243.png" alt="" width="300" height="243" /></a></p>
<p>หลังจากนั้นก็ออกแบบหน้าตาโปรแกรมกัน โดย double click ไปที่ view หลังจากนั้นก็ละเลง โดยหน้าตาของโปรแกรมเราก็ไม่ได้มีอะไรมาก interface ประกอบไปด้วย</p>
<ul>
<li>UITextField เพื่อเป็นส่วนของ input</li>
<li>UILable เป็นส่วน output ของโปรแกรม</li>
<li>และปุ่ม UIButton อีก 1 ปุ่ม</li>
</ul>
<p>และแล้วหน้าตาของโปรแกรม ก็จะออกมาแบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/interface.png" rel="lightbox[374]"><img class="size-medium wp-image-383 aligncenter" title="interface" src="http://www.macfeteria.com/wp-content/uploads/2008/09/interface-191x300.png" alt="" width="191" height="300" /></a></p>
<h2>AppController Class</h2>
<p>ถ้ายังพอจะจำ Cocoa Programming ได้จะเห็นว่าเกือบจะทุกครั้ง เราจะทำการ สร้าง Class ที่ชื่อว่า AppController เพื่อเอาไว้จัดการ interface โดยเราจะประกาศ member ที่เป็น outlet ไว้ที่ class นี้  แต่ครั้งนี้เราไม่ต้องเพิ่ม AppController เข้าไปเพราะว่า เราได้มี Class ที่ทำหน้าที่เหมือน AppController อยู่แล้ว นั่นก็คือ iPhoneStringCountViewController ( ส่วน คลาส AppDelegate นี้เป็นตัวจัดการกับ view ย่อยๆ แต่ในโปรแกรมนี้เรามีแค่ 1 view ฉนั้นเราก็ไม่ต้องไปทำอะไรกับมัน )</p>
<p>ก็เหมือนๆกับ การเขียน Cocoa ปกติเราต้องประกาศ  member ที่เป็น outlet เพื่อเอาไว้เชื่อมกับ interface ที่ได้ออกแบบไว้ และก็ต้องมี method ที่เป็น action สำหรับ button ที่เราได้ทำไว้</p>
<p>งั้นเราประกาศ member ที่ชื่อว่า m_textInput เพื่อเป็นส่วนของ input และ m_textOutput เพื่อเป็นส่วนของ output ของโปรแกรม และเราก็มี method ที่ชื่อว่า countString เพื่อจะเป็น action สำหรับการกดปุ่ม</p>
<p>เราก็เปิด file iPhoneStringCountViewController.m และก็เขียนได้แบบนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> iPhoneStringCountViewController <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	IBOutlet UITextField <span style="color: #002200;">*</span>m_textInput;
	IBOutlet UILabel <span style="color: #002200;">*</span>m_textOutput;
<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> countString<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>ก็เป็นว่าตอนนี้เราก็ได้ เขียน class เรียบร้อยแล้ว งั้นขั้นตอนต่อไปก็คือ การเชื่อมกับ Interface ที่ได้ออกแบบไว้</p>
<h2>Back to Interface Builder</h2>
<p>ก็หลังจากแก้ไข class แล้วต่อไปก็คือทำให้มันเชื่อมต่อกับ interface วิธีการก็ไม่ได้ยาก ทำเหมือน Cocoa ดั้งเดิมทุกประการ ถ้ายังจำ Cocoa Tutorial แรกได้ผมจะเพ่ิม Object เข้ามา นั่นก็คือ Instance ของ AppController แต่สำหรับ ครั้งนี้เราไม่ต้องไปเพิ่มเข้ามาเพราะว่า File&#8217;s Owner นั้นก็เป็น Instance ของ ViewController อยู่แล้ว ฉนั้นแล้วเราก็ Click ขวาที่ File&#8217;s Owner เลยครับจะเห็น panel ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/stringcountpanel.png" rel="lightbox[374]"><img class="size-medium wp-image-384 aligncenter" title="stringcountpanel" src="http://www.macfeteria.com/wp-content/uploads/2008/09/stringcountpanel-300x254.png" alt="" width="300" height="254" /></a></p>
<p>จะเห็นว่ามี Outlet ที่ชื่อว่า m_textInput และ m_textOutput อยู่แล้ว หลังจากนั้นเราก็ลากไปเชื่อมกับ interface ดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/link.png" rel="lightbox[374]"><img class="size-medium wp-image-385 aligncenter" title="link" src="http://www.macfeteria.com/wp-content/uploads/2008/09/link-300x155.png" alt="" width="300" height="155" /></a></p>
<p>และขั้นตอนต่อไปเราก็เชื่อม button ของเรากับ action ที่เราได้ประกาศไว้นั่นก็คือ countString ก็คือลาก กด ctrl ค้างที่ ปุ่มแล้วก็ลากมาดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/action.png" rel="lightbox[374]"><img class="size-medium wp-image-386 aligncenter" title="action" src="http://www.macfeteria.com/wp-content/uploads/2008/09/action-300x175.png" alt="" width="300" height="175" /></a></p>
<p>ก็จะเห็นว่ามี Panel ขึ้นมา ก็เลือก countString</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/panel.png" rel="lightbox[374]"><img class="size-medium wp-image-387 aligncenter" title="panel" src="http://www.macfeteria.com/wp-content/uploads/2008/09/panel-300x211.png" alt="" width="300" height="211" /></a></p>
<p>ก็เป็นอันเสร็จในส่วนของ การเชื่อมระหว่าง Interface กับ Outlet</p>
<h2>Implement</h2>
<p>และส่วนสุดท้ายก็คือการเขียน Implement นั่นเอง ก็ไม่ได้มีอะไรมาก เราก็ทำการ รับ input มาจาก UITextField และก็นับจำนวนสตริง หลังจากนั้นก็ แสดงมาที่ UILable สำหรับ Code ก็เปิด File ที่ชื่อว่า iPhoneStringCountViewController.m  แล้วก็เขียน countString ลงไป แบบนี้</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> countString<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">int</span> count <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_textInput text<span style="color: #002200;">&#93;</span>;
	count <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>text length<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_textOutput setText<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;String Length: %i&quot;</span>,count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>เพียงเท่านี้ก็เป็นอันเสร็จ เรามาลอง Compile และ Run ดูครับ ก็จะได้โปรแกรมหน้าตาแบบนี้ ก็ลองพิมพ์และลองกด click me ก็จะได้ผลลัพธ์ออกมา</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/iphone.png" rel="lightbox[374]"><img class="size-medium wp-image-388 aligncenter" title="iphone" src="http://www.macfeteria.com/wp-content/uploads/2008/09/iphone-156x300.png" alt="" width="156" height="300" /></a></p>
<p>เป็นไงบ้างครับ สำหรับ iPhone Tutorial แรกๆ ติชมกันเข้ามาครับ ว่าดีไม่ดีอย่างไร หรือไปพูดคุยกันได้ที่ <a href="http://www.macfeteria.com/forum">Forum</a></p>
<p><a href="http://www.macfeteria.com/wp-content/uploads/2008/09/stringcount.zip">Download Source Code</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' 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/programming' rel='tag' target='_self'>programming</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2008/09/08/iphone-programming-begin/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Cocoa Programming Video Tutorial</title>
		<link>http://www.macfeteria.com/blog/2008/08/27/cocoa-programming-video-tutorial/</link>
		<comments>http://www.macfeteria.com/blog/2008/08/27/cocoa-programming-video-tutorial/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 02:08:11 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[video tutorial]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=359</guid>
		<description><![CDATA[เป็น tutorial ในรูปแบบ vdo อันที่ 2 แล้วนะครับ เป็นการสอนการเขียนโปรแกรมด้วย cocoa อย่างง่ายๆ ด้วยโปรแกรมนับจำนวนตัวอักษรใน text field [flv]http://www.macfeteria.com/wp-content/uploads/2008/08/cocoa.flv[/flv] ถ้าอยากดูชัดๆก็โหลด .mov ไปดูได้ึีครับ Download Cocoa Video tutorial (37 mb.) ก็ขอว่าอย่าเอาไป upload ลงที่อื่นนะครับ Youtube ยังงี้ Technorati Tags: cocoa, video tutorial]]></description>
			<content:encoded><![CDATA[<p>เป็น tutorial ในรูปแบบ vdo อันที่ 2 แล้วนะครับ เป็นการสอนการเขียนโปรแกรมด้วย cocoa อย่างง่ายๆ ด้วยโปรแกรมนับจำนวนตัวอักษรใน text field</p>
<p>[flv]http://www.macfeteria.com/wp-content/uploads/2008/08/cocoa.flv[/flv]</p>
<p>ถ้าอยากดูชัดๆก็โหลด .mov ไปดูได้ึีครับ</p>
<p><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/cocoa.mov">Download Cocoa Video tutorial</a> (37 mb.)</p>
<p>ก็ขอว่าอย่าเอาไป upload ลงที่อื่นนะครับ Youtube ยังงี้</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/video+tutorial' rel='tag' target='_self'>video tutorial</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.macfeteria.com/blog/2008/08/27/cocoa-programming-video-tutorial/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
<enclosure url="http://www.macfeteria.com/wp-content/uploads/2008/08/cocoa.mov" length="38588150" type="video/quicktime" />
		</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>
		<item>
		<title>Cocoa Programming II : NSTableView Advance</title>
		<link>http://www.macfeteria.com/blog/2008/08/08/cocoa-programming-nstableview-advance/</link>
		<comments>http://www.macfeteria.com/blog/2008/08/08/cocoa-programming-nstableview-advance/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 10:43:02 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[advance]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[NSTableView]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=282</guid>
		<description><![CDATA[หลังจากได้ลองเขียน NSTableView ดูกันแล้ว วันนี้ก็ยังคงต่อด้วยเรื่องของ NSTableView เหมือนเดิมแต่ว่าเป็นขั้น Advance มากกว่าเดิม More about datasource จากโปรแกรมแสดงตารางรายชื่อครั้งก่อน จะเห็นว่าเราได้ set datasource มาที่ AppController และเราก็เขียน implement delegate ของ datasource ที่ AppController จะเห็นว่าวิธีแบบนี้ไม่ค่อยจะยืดหยุ่นมากนัก เพราะเนื่องจากว่าเราให้ AppController เป็นทั้งตัวควบคุม interface และยังให้เป็น datasource สมมติว่าเราต้องการมี table มากกว่า 1 table และแต่ละ table มี datasource ที่มีข้อมูลต่างกัน เราก็คงต้องเพิ่ม datasource ให้เท่ากับจำนวนของ table ซึ่งนั่นก็แปลว่าเราก็ต้องสร้าง AppController instance มาหลายๆอัน มันก็คงจะไม่ใช่วิธีที่ดีนัก และที่สำคัญตัวโปรแกรมจะมองว่า AppController instance ที่เราสร้างขึ้นมาใหม่ มันเป็นตัวเดียวกัน [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจากได้ลองเขียน NSTableView ดูกันแล้ว วันนี้ก็ยังคงต่อด้วยเรื่องของ NSTableView เหมือนเดิมแต่ว่าเป็นขั้น Advance มากกว่าเดิม</p>
<h2><span style="color: #cccc33;">More about datasource</span></h2>
<p>จากโปรแกรมแสดงตารางรายชื่อครั้งก่อน จะเห็นว่าเราได้ set datasource มาที่ AppController และเราก็เขียน implement delegate ของ datasource ที่ AppController จะเห็นว่าวิธีแบบนี้ไม่ค่อยจะยืดหยุ่นมากนัก เพราะเนื่องจากว่าเราให้ AppController เป็นทั้งตัวควบคุม interface และยังให้เป็น datasource</p>
<p>สมมติว่าเราต้องการมี table มากกว่า 1 table และแต่ละ table มี datasource ที่มีข้อมูลต่างกัน เราก็คงต้องเพิ่ม datasource ให้เท่ากับจำนวนของ table ซึ่งนั่นก็แปลว่าเราก็ต้องสร้าง AppController instance มาหลายๆอัน มันก็คงจะไม่ใช่วิธีที่ดีนัก และที่สำคัญตัวโปรแกรมจะมองว่า AppController instance ที่เราสร้างขึ้นมาใหม่ มันเป็นตัวเดียวกัน ดังนั้นข้อมูลใน table A และ B ก็จะเหมือนกัน ( ดูรูปประกอบ ) ฉนั้นแล้วการที่เราให้ AppController เป็น datasource โดยตรงก็คงไม่ดีแน่</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/app_datasource.png" rel="lightbox[282]"><img class="size-medium wp-image-284 aligncenter" title="app_datasource" src="http://www.macfeteria.com/wp-content/uploads/2008/08/app_datasource-300x99.png" alt="" width="300" height="99" /></a></p>
<p style="text-align: left;">งั้นแทนที่เราจะให้ Class AppController เป็น datasource โดยตรง เราก็เปลี่ยนให้ AppController มี member เป็น datasource ก็น่าจะดีกว่า</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/datasource1.png" rel="lightbox[282]"><img class="size-medium wp-image-286 aligncenter" title="datasource1" src="http://www.macfeteria.com/wp-content/uploads/2008/08/datasource1-300x115.png" alt="" width="300" height="115" /></a></p>
<p style="text-align: left;">จากรูปข้างบน จะเห็นว่า เราก็สามารถมีหลายๆ datasource ที่ต่างกันได้ แล้วเราจะเขียน class ออกมาได้ยังไง ? งั้นมาดูตัวอย่างจริงกันเลยดีกว่า<span id="more-282"></span></p>
<p style="text-align: left;">สมมติว่า เราต้องการ เขียนโปรแกรมแสดงรายชื่อเหมือนเดิม แต่เราต้องการแยก class datasource ออกมาจาก AppController โดยให้ชื่อว่า StudentDataSource</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> StudentDataSource <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_arrayNameData;
<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> AddStudentRecord<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> name;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> numberOfRowsInTableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> table;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>  tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>aTableView 
        objectValueForTableColumn<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableColumn</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>
        aTableColumn row<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>rowIndex;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จาก Class StudentDataSource ข้างบนเราก็ได้ให้ NSMutableArray เป็นตัวเก็บข้อมูล รายชื่อ และในส่วนของ implement ก็เขียนได้ลักษณะแบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> StudentDataSource
<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_arrayNameData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_arrayNameData retain<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> self;
<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>m_arrayNameData 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: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> numberOfRowsInTableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> table
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>m_arrayNameData 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><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>table
      objectValueForTableColumn<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableColumn</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableColumn
      row<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> rows
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>m_arrayNameData objectAtIndex<span style="color: #002200;">:</span>rows<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> AddStudentRecord<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> name
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span>name 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;">&#91;</span>m_arrayNameData addObject<span style="color: #002200;">:</span>name<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>ก็เป็นว่าตอนนี้เรามี Class ที่เป็น DataSource ต่อไปก็แก้ไข AppController ของเรา แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><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;">NSTableView</span> <span style="color: #002200;">*</span>m_tableView;
    IBOutlet <span style="color: #400080;">NSButton</span> <span style="color: #002200;">*</span>m_button;
    IBOutlet <span style="color: #400080;">NSTextField</span> <span style="color: #002200;">*</span>m_textFields;
&nbsp;
    StudentDataSource <span style="color: #002200;">*</span>m_dataSource;
<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> AddRecord<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>จะเห็นว่า เรามี member ที่เป็น StudentDataSource เข้ามาด้วย และในส่วน 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;">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_dataSource <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>StudentDataSource alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_dataSource retain<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> awakeFromNib
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>m_tableView setDataSource<span style="color: #002200;">:</span>m_dataSource<span style="color: #002200;">&#93;</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>m_dataSource 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: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> AddRecord<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> name <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_textFields stringValue<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_dataSource AddStudentRecord<span style="color: #002200;">:</span>name<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_tableView reloadData<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>จาก Code ข้างบนจะมีส่วนที่สำคัญคือ awakeFromNib จะเห็นว่าเมื่อโปรแกรมเริ่มทำงาน เราก็ Set DataSource ให้กับ m_tableView ในทันที และเราก็ไม่ต้องไป link ที่ interface builder เลย</p>
<p>ลอง <a href="http://www.macfeteria.com/wp-content/uploads/2008/08/studenttable.zip">Download Source</a> ไปลอง  Compile ดูครับ โปรแกรมก็ทำงานเหมือนเดิมแต่ ต่างกันตรงที่เราแยก datasource ออกมาให้เป็น member ของ AppController ต่อไปถ้าหากเราต้องการ มีหลายๆตาราง และ datasource ที่ต่างกัน ก็สามารถทำได้แล้วครับ</p>
<h2><span style="color: #cccc33;">Editable Cell</span></h2>
<p>โปรแกรมที่เราได้ลองเขียนนั้น เป็นแค่การอ่านข้อมูลมาแสดงผลอย่างเดียว ไม่สามารถ แก้ไขข้อมูลภายใน Cell ได้ ถ้าหากเราต้องการให้ table ของเราสามารถแก้ไขได้ เราต้อง implement delegate method เพิ่มอีก 1 นั่นก็คือ</p>
<p>- (void)<strong>tableView</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> NSTableView *)aTable <strong>setObjectValue</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> id)aData<br />
<strong>forTableColumn</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> NSTableColumn *)aCol<br />
<strong>row</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> int)aRow;</p>
<p>และจากโปรแกรมข้างบน ก็สามารถเขียนเพ่ิมให้ table ของเราสามารถแก้ไขข้อมูลได้ ดังตัวอย่าง code ข้างล่าง</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>aTable setObjectValue<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>aData
        forTableColumn<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableColumn</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>aCol
        row<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>aRow
<span style="color: #002200;">&#123;</span>
   <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>text <span style="color: #002200;">=</span> aData;
   <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>m_arrayNameData objectAtIndex<span style="color: #002200;">:</span> aRow<span style="color: #002200;">&#93;</span> isEqualToString<span style="color: #002200;">:</span>text<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #a61390;">NO</span><span style="color: #002200;">&#41;</span>
   <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>m_arrayNameData replaceObjectAtIndex<span style="color: #002200;">:</span>aRow withObject<span style="color: #002200;">:</span>aData<span style="color: #002200;">&#93;</span>;
   <span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>ก็ลองโหลด <a href="http://www.macfeteria.com/wp-content/uploads/2008/08/studenttableeditable.zip">Source Code</a> ไปลอง Compile เล่นดู</p>
<h2><span style="color: #cccc33;">More Column</span></h2>
<p>จากตัวอย่างที่เขียนไปเราได้สร้างตารางที่มีแค่ 1 column เท่านั้น ถ้าหากต้องการสร้าง หลายๆ Column แล้วเราก็เพียงแค่ไปเปลี่ยน ค่าของจำนวน column ใน interface builder แบบรูปข้างล่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/inspector_column.png" rel="lightbox[282]"><img class="size-medium wp-image-291 aligncenter" title="inspector_column" src="http://www.macfeteria.com/wp-content/uploads/2008/08/inspector_column-249x300.png" alt="" width="249" height="300" /></a></p>
<p style="text-align: left;">การสร้าง interface  ก็คงไม่ยากอะไร แต่ปัญหาคือ เราจะเขียน Code ให้มันแสดง cell ที่ตำแหน่ง column ที่เราต้องการได้อย่างไร ?</p>
<p style="text-align: left;">วีธีการก็คือ เราต้อง กำหนดชื่อ ให้กับ Column ก่อน แล้วก็แก้ไข code ในส่วนของ</p>
<p style="text-align: left;">-(id) tableView:(NSTableView*)    table<br />
objectValueForTableColumn:(NSTableColumn*) tableColumn<br />
row:(int) rows</p>
<p style="text-align: left;">สมมติว่า เราต้องการแก้ไข โปรแกรม แสดงรายชื่อนักเรียน ให้มีอีก 1 Column เพื่อแสดงสาขาที่เรียนของนักเขียนด้วย หน้าตาโปรแกรม เป็นลักษณะแบบนี้</p>
<p style="text-align: left;">เราก็ทำการแก้ไข datasource ของเราให้มี array เพ่ิมขึ้นมาอีก 1 เพื่อเอาไว้เก็บ สาขาที่เรียนของนักเรียน อาจจะเขียนใหม่ได้ว่า</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> StudentDataSource <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_arrayNameData;
   <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>m_arrayDepartmentData;
<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> AddStudentRecord<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>name 
        andDepartment<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> department;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>และเราก็เขียน 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>IBAction<span style="color: #002200;">&#41;</span> AddRecord<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> name <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_textFields stringValue<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> department <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_textFields stringValue<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>m_dataSource AddStudentRecord<span style="color: #002200;">:</span>name andDepartment<span style="color: #002200;">:</span>department<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_tableView reloadData<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>และส่วนที่สำคัญที่สุดคือ tableView: objectValueForTableColumn: row: เราต้องเขียนให้มันส่ง ตำแหน่ง cell ใน column ที่ต้องการให้เป็นแบบนี้</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> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>	table
      objectValueForTableColumn<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableColumn</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableColumn
      row<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> rows
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>columnName;
	columnName <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tableColumn identifier<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span>columnName isEqualToString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;name&quot;</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #a61390;">YES</span> <span style="color: #002200;">&#41;</span>
		<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>m_arrayNameData objectAtIndex<span style="color: #002200;">:</span>rows<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">else</span>
		<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>m_arrayDepartMentData objectAtIndex<span style="color: #002200;">:</span>rows<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>จาก code ข้างบนเราสามารถอ้างอิงถึง column ได้โดยการใช้ column identifier เป็นการตรวจสอบว่า เป็น column ของเราที่ต้องการหรือเปล่า  อย่างตัวอย่างเราก็ได้ให้ เปรียบเทียบว่าเป็น column &#8220;name&#8221; หรือไม่ และการใส่ค่าให้กับ column identifier เราทำได้โดยการใช้ interface builder และใส่ค่าให้กับ column เหมือนรูปข้างล่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/column_identifier.png" rel="lightbox[282]"><img class="size-medium wp-image-294 aligncenter" title="column_identifier" src="http://www.macfeteria.com/wp-content/uploads/2008/08/column_identifier-300x104.png" alt="" width="300" height="104" /></a></p>
<p style="text-align: left;">แล้วก็ Compile ดูครับ เพียงเท่านี้ก็เป็นอันเรียบร้อย โปรแกรมก็จะออกมาแบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/morecolumn.png" rel="lightbox[282]"><img class="size-medium wp-image-295 aligncenter" title="morecolumn" src="http://www.macfeteria.com/wp-content/uploads/2008/08/morecolumn-300x223.png" alt="" width="300" height="223" /></a></p>
<p style="text-align: left;">สำหรับ Source ก็โหลดได้นี่เลย <a href="http://www.macfeteria.com/wp-content/uploads/2008/08/studentdepartmenttable.zip">Download Source Code</a></p>

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

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/advance' rel='tag' target='_self'>advance</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/NSTableView' rel='tag' target='_self'>NSTableView</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/08/cocoa-programming-nstableview-advance/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cocoa Programming II : NSTableView</title>
		<link>http://www.macfeteria.com/blog/2008/08/01/cocoa-programming-nstableview/</link>
		<comments>http://www.macfeteria.com/blog/2008/08/01/cocoa-programming-nstableview/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 14:15:54 +0000</pubDate>
		<dc:creator>[Ter]</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[basic]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[NSTableColumn]]></category>
		<category><![CDATA[NSTableView]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.macfeteria.com/?p=242</guid>
		<description><![CDATA[NSTableView NSTableView คือ class ที่ช่วยในการแสดงผลแบบตาราง ใน NSTableView จะมี helper object หนึ่งที่ชื่อว่า datasource ช่วยในการแสดงผลของข้อมูล ซึ่งการทำงานของ NSTableView จะไม่ใช่ลักษณะที่ตัวโปรแกรมเป็นคนส่ง message บอกกับ NSTableView เช่นให้แสดงคำว่า Hello ตัวโปรแกรมหลักจะไม่ได้เป็นคนสั่งบอกับ NSTableView ว่าให้แสดงคำว่า Hello ที่แถวที่สอง แต่ในทางกลับกันมันจะไปถาม helper object ว่าในแถวที่สองมีอะไรที่ต้องแสดง ในกรณีนี้ datasource ก็จะส่ง Hello กลับมาให้ยัง NSTable แบบรูปข้างล่าง และในการใช้งาน NSTableView นั้นเราต้อง implement delegate method ( หากไม่เข้าใจ delegate ให้ไปอ่าน cocoa programming delegate ) ด้วยกัน 2 อย่างคือ -(int) [...]]]></description>
			<content:encoded><![CDATA[<h2>NSTableView</h2>
<p>NSTableView คือ class ที่ช่วยในการแสดงผลแบบตาราง ใน NSTableView จะมี helper object หนึ่งที่ชื่อว่า datasource ช่วยในการแสดงผลของข้อมูล ซึ่ง<span style="text-decoration: underline;">การทำงานของ NSTableView จะไม่ใช่ลักษณะที่ตัวโปรแกรมเป็นคนส่ง message บอกกับ NSTableView เช่นให้แสดงคำว่า Hello</span> ตัวโปรแกรมหลักจะไม่ได้เป็นคนสั่งบอกับ NSTableView ว่าให้แสดงคำว่า Hello ที่แถวที่สอง แ<span style="text-decoration: underline;">ต่ในทางกลับกันมันจะไปถาม helper object ว่าในแถวที่สองมีอะไรที่ต้องแสดง</span> ในกรณีนี้ datasource ก็จะส่ง Hello กลับมาให้ยัง NSTable แบบรูปข้างล่าง</p>
<p style="text-align: center;"><img class="size-full wp-image-243 aligncenter" title="nstableview" src="http://www.macfeteria.com/wp-content/uploads/2008/07/nstableview.png" alt="" width="531" height="138" /></p>
<p style="text-align: center;">
<p style="text-align: left;">และในการใช้งาน NSTableView นั้นเราต้อง implement delegate method ( หากไม่เข้าใจ delegate ให้ไปอ่าน <a href="http://www.macfeteria.com/2008/07/cocoa-programming-delegate/">cocoa programming delegate</a> ) ด้วยกัน 2 อย่างคือ</p>
<ul>
<li>-(int) <strong>numberOfRowInTableView</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> NSTableView*) tableView;<br />
ส่งค่าของจำนวน row กลับมา</li>
<li>-(id) <strong>tableView</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> NSTableView *) tableView<br />
<strong>objectValueForTableColumn</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> NSTableColumn*) tableColumn<br />
<strong>row</strong> <img src='http://www.macfeteria.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> int) rowIndex;<br />
ส่ง object ที่ต้องไปแสดงผลที่ row ละ column</li>
</ul>
<p>เอาละเมื่อเข้าใจคร่าวๆแล้ว เราก็มาลองเขียนโปรแกรมเล่นๆ กันดู สมมติว่าเราต้องการเขียนโปรแกรมแบบตัวอย่างดังรูป<span id="more-242"></span></p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/student_window.png" rel="lightbox[242]"><img class="size-medium wp-image-245 aligncenter" title="student_window" src="http://www.macfeteria.com/wp-content/uploads/2008/08/student_window-300x131.png" alt="" width="300" height="131" /></a></p>
<p style="text-align: left;">งั้นเรามาเริ่มกันเลยดีกว่า</p>
<h2>Let&#8217;s go</h2>
<p style="text-align: left;">1. สร้างโปรเจค Cocoa Application ขึ้นมากก่อน แล้วก็ แก้ไข MainMenu.xib ของเราให้มีหน้าตาแบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/name_interface.png" rel="lightbox[242]"><img class="size-medium wp-image-247 aligncenter" title="Name Interface" src="http://www.macfeteria.com/wp-content/uploads/2008/08/name_interface-300x207.png" alt="" width="300" height="207" /></a></p>
<p style="text-align: left;">2. แก้ไข Column ให้เหลือแค่ 1 โดยการ Click ไปที่ NSTableView  และเปิด inspector ขึ้นมาแล้วก็ปรับค่า ตรง Columns ให้เป็น 1</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/column.png" rel="lightbox[242]"><img class="size-medium wp-image-257 aligncenter" title="column" src="http://www.macfeteria.com/wp-content/uploads/2008/08/column-300x223.png" alt="" width="300" height="223" /></a></p>
<p style="text-align: left;">3. หลังจากนั้น เราก้อ Add File เข้าไป โดยให้ชื่อว่า AppController</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/app.png" rel="lightbox[242]"><img class="size-medium wp-image-258 aligncenter" title="app" src="http://www.macfeteria.com/wp-content/uploads/2008/08/app-300x173.png" alt="" width="300" height="173" /></a></p>
<p style="text-align: left;">4.เราก็ทำการแก้ไข File AppController.h โดยเพิ่ม member และ method เข้าไปดัง code ข้างล่าง</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><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;">NSTableView</span><span style="color: #002200;">*</span> m_table;
IBOutlet <span style="color: #400080;">NSTextField</span><span style="color: #002200;">*</span> m_textName;
<span style="color: #400080;">NSMutableArray</span><span style="color: #002200;">*</span>    m_array;	<span style="color: #11740a; font-style: italic;">// Store Data</span>
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> AddRecord<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender;
<span style="color: #a61390;">@end</span></pre></div></div>

<p style="text-align: left;">5. กลับไปที่ interface builder และเราก็จะเพิ่ม AppController เข้ามาโดยการลาก Object (กล่องสีฟ้า) มายัง xib ของเรา และ เปิด inspector ขึ้นมาและตั้งค่าให้เป็นดังรูป</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/appcontroller.png" rel="lightbox[242]"><img class="size-medium wp-image-252 aligncenter" title="Appcontroller" src="http://www.macfeteria.com/wp-content/uploads/2008/08/appcontroller-300x239.png" alt="" width="300" height="239" /></a></p>
<p style="text-align: left;">6. และขั้นต่อไปคือ การ Link Object กับ Interface เข้าด้วยกัน โดยเราจะเริ่มจาก m_table กับ NSTableView ใน interface builder แบบรูปข้างล่าง</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/link_table.png" rel="lightbox[242]"><img class="size-medium wp-image-250 aligncenter" title="Link with table" src="http://www.macfeteria.com/wp-content/uploads/2008/08/link_table-300x160.png" alt="" width="300" height="160" /></a></p>
<p style="text-align: left;">7. และก็ link ส่วนที่เหลือนั่นก็คือ m_textName กับ NSTextFields</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/link_textfield.png" rel="lightbox[242]"><img class="size-medium wp-image-251 aligncenter" title="Link with Textfield" src="http://www.macfeteria.com/wp-content/uploads/2008/08/link_textfield-300x153.png" alt="" width="300" height="153" /></a></p>
<p style="text-align: left;">8. และเมื่อทำการ Link interface เข้ากับ object แล้วต่อไปก็ทำการ Link interface กับ method โดยเราจะ Link ระหว่างปุ่ม insert เพื่อให้เวลากด แล้วมันจะไปเรียกใช้ method ที่ชื่อว่า addRecord ( อย่าลืมกด ctrl ค้างระหว่างลาก link จาก  Button มายัง App Controller ด้วยนะ )</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/buttonconnect.png" rel="lightbox[242]"><img class="size-medium wp-image-253 aligncenter" title="Button Connect" src="http://www.macfeteria.com/wp-content/uploads/2008/08/buttonconnect-300x124.png" alt="" width="300" height="124" /></a></p>
<p style="text-align: left;">9. และสุดท้ายสำหรับ  interface คือการที่เราจะ set datasource ให้กับ tableView ของเราเพราะอย่างที่บอกไปแล้วว่า NSTableView  นั้นต้องมี datasource และเราก็ทำการ set datasource เข้ากับ AppController ( หมายความว่า AppController เป็น dataSource ให้กับ m_table นั่นเอง )</p>
<p style="text-align: left;">อันดับแรกให้เรา  click ไปที่ NSTableView และเปิด Control Panel ด้วยการ Click ขวา และหลังจากนั้น ก็ให้ click ไปยังลูกศร ตรงขวา บน เหมือนในรูป  แล้วก็เลือก Table View</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/connection_panel.png" rel="lightbox[242]"><img class="size-medium wp-image-254 aligncenter" title="Connection Panel" src="http://www.macfeteria.com/wp-content/uploads/2008/08/connection_panel-300x156.png" alt="" width="300" height="156" /></a></p>
<p style="text-align: left;">10. หลังจากนั้นก็จะเห็น Panel แบบรูปข้างล่าง แล้วเราก็ Link dataSource มายัง App Controller</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/datasource.png" rel="lightbox[242]"><img class="size-medium wp-image-255 aligncenter" title="DataSource" src="http://www.macfeteria.com/wp-content/uploads/2008/08/datasource-300x150.png" alt="" width="300" height="150" /></a></p>
<p style="text-align: left;">11. ก็เป็นอันจบว่าเราได้สร้าง interface เรียบร้อยแล้ว และต่อไปก็เป็นการ เขียน code ในส่วน implement ก็แก้ไข File AppController.m แบบนี้</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;">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_array <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>m_array retain<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_array 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: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> numberOfRowsInTableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> table
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>m_array 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><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableView</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> table
			objectValueForTableColumn<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSTableColumn</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> tableColumn
			row<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span> row
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>m_array objectAtIndex<span style="color: #002200;">:</span>row<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>	
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span> AddRecord<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>m_textName stringValue<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> text <span style="color: #002200;">!=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span><span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span>m_array addObject<span style="color: #002200;">:</span>text<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>m_table reloadData<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p style="text-align: left;">จาก Code ข้างบนขออธิบายส่วนสำคัญ ก็คือในส่วนของ</p>
<ul>
<li>numberOfRowsInTableView:  ตรงนี้เราให้ return จำนวนของ ข้อมูลที่เก็บไว้ยัง m_array</li>
<li>tableView: objectValueForTableColumn: row:  ให้ return ข้อมูลของ m_array ตามตำแหน่งของ row</li>
<li>AddRecord: เพิ่มจำนวน record เข้าไปยัง m_array และ ให้ table เรียกแสดงข้อมูลใหม่ด้วยคำสั่ง  reloadData</li>
</ul>
<p style="text-align: left;">12 Compile &amp; Run ก็จะได้ผลลัพธ์แบบนี้</p>
<p style="text-align: center;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/result.png" rel="lightbox[242]"><img class="size-medium wp-image-256 aligncenter" title="Result" src="http://www.macfeteria.com/wp-content/uploads/2008/08/result-300x207.png" alt="" width="300" height="207" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">หวังว่าไม่ยากจนเกินไปนะครับ ติดตรงไหน แนะนำติชม กันได้  ก็ลองโหลด source ไปลอง compile ได้ครับ</p>
<p style="text-align: left;"><a href="http://www.macfeteria.com/wp-content/uploads/2008/08/nametable.zip">Download Source Files</a></p>
<p style="text-align: left;">

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

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/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/NSTableColumn' rel='tag' target='_self'>NSTableColumn</a>, <a class='technorati-link' href='http://technorati.com/tag/NSTableView' rel='tag' target='_self'>NSTableView</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/01/cocoa-programming-nstableview/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

