<?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; NSTableColumn</title>
	<atom:link href="http://www.macfeteria.com/blog/tag/nstablecolumn/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>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>

