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) numberOfRowInTableView
NSTableView*) tableView;
ส่งค่าของจำนวน row กลับมา - -(id) tableView
NSTableView *) tableView
objectValueForTableColumn
NSTableColumn*) tableColumn
row
int) rowIndex;
ส่ง object ที่ต้องไปแสดงผลที่ row ละ column
เอาละเมื่อเข้าใจคร่าวๆแล้ว เราก็มาลองเขียนโปรแกรมเล่นๆ กันดู สมมติว่าเราต้องการเขียนโปรแกรมแบบตัวอย่างดังรูป
งั้นเรามาเริ่มกันเลยดีกว่า
Let’s go
1. สร้างโปรเจค Cocoa Application ขึ้นมากก่อน แล้วก็ แก้ไข MainMenu.xib ของเราให้มีหน้าตาแบบนี้
2. แก้ไข Column ให้เหลือแค่ 1 โดยการ Click ไปที่ NSTableView และเปิด inspector ขึ้นมาแล้วก็ปรับค่า ตรง Columns ให้เป็น 1
3. หลังจากนั้น เราก้อ Add File เข้าไป โดยให้ชื่อว่า AppController
4.เราก็ทำการแก้ไข File AppController.h โดยเพิ่ม member และ method เข้าไปดัง code ข้างล่าง
@interface AppController : NSObject { IBOutlet NSTableView* m_table; IBOutlet NSTextField* m_textName; NSMutableArray* m_array; // Store Data } -(IBAction) AddRecord:(id) sender; @end
5. กลับไปที่ interface builder และเราก็จะเพิ่ม AppController เข้ามาโดยการลาก Object (กล่องสีฟ้า) มายัง xib ของเรา และ เปิด inspector ขึ้นมาและตั้งค่าให้เป็นดังรูป
6. และขั้นต่อไปคือ การ Link Object กับ Interface เข้าด้วยกัน โดยเราจะเริ่มจาก m_table กับ NSTableView ใน interface builder แบบรูปข้างล่าง
7. และก็ link ส่วนที่เหลือนั่นก็คือ m_textName กับ NSTextFields
8. และเมื่อทำการ Link interface เข้ากับ object แล้วต่อไปก็ทำการ Link interface กับ method โดยเราจะ Link ระหว่างปุ่ม insert เพื่อให้เวลากด แล้วมันจะไปเรียกใช้ method ที่ชื่อว่า addRecord ( อย่าลืมกด ctrl ค้างระหว่างลาก link จาก Button มายัง App Controller ด้วยนะ )
9. และสุดท้ายสำหรับ interface คือการที่เราจะ set datasource ให้กับ tableView ของเราเพราะอย่างที่บอกไปแล้วว่า NSTableView นั้นต้องมี datasource และเราก็ทำการ set datasource เข้ากับ AppController ( หมายความว่า AppController เป็น dataSource ให้กับ m_table นั่นเอง )
อันดับแรกให้เรา click ไปที่ NSTableView และเปิด Control Panel ด้วยการ Click ขวา และหลังจากนั้น ก็ให้ click ไปยังลูกศร ตรงขวา บน เหมือนในรูป แล้วก็เลือก Table View
10. หลังจากนั้นก็จะเห็น Panel แบบรูปข้างล่าง แล้วเราก็ Link dataSource มายัง App Controller
11. ก็เป็นอันจบว่าเราได้สร้าง interface เรียบร้อยแล้ว และต่อไปก็เป็นการ เขียน code ในส่วน implement ก็แก้ไข File AppController.m แบบนี้
@implementation AppController -(id) init { [super init]; m_array = [NSMutableArray array]; [m_array retain]; return self; } -(void) dealloc { [m_array release]; [super dealloc]; } -(int) numberOfRowsInTableView:(NSTableView*) table { return [m_array count]; } -(id) tableView:(NSTableView*) table objectValueForTableColumn:(NSTableColumn*) tableColumn row:(int) row { return [m_array objectAtIndex:row]; } -(IBAction) AddRecord:(id) sender { NSString* text = [m_textName stringValue]; if( text != @"") { [m_array addObject:text]; [m_table reloadData]; } } @end
จาก Code ข้างบนขออธิบายส่วนสำคัญ ก็คือในส่วนของ
- numberOfRowsInTableView: ตรงนี้เราให้ return จำนวนของ ข้อมูลที่เก็บไว้ยัง m_array
- tableView: objectValueForTableColumn: row: ให้ return ข้อมูลของ m_array ตามตำแหน่งของ row
- AddRecord: เพิ่มจำนวน record เข้าไปยัง m_array และ ให้ table เรียกแสดงข้อมูลใหม่ด้วยคำสั่ง reloadData
12 Compile & Run ก็จะได้ผลลัพธ์แบบนี้
หวังว่าไม่ยากจนเกินไปนะครับ ติดตรงไหน แนะนำติชม กันได้ ก็ลองโหลด source ไปลอง compile ได้ครับ














http://khajochi.myopenid.com/ says:
ขอถามหน่อยสิครับ … แล้วเราจะรู้ได้อย่างไรว่าเราต้องสร้าง method tableView กับ numberOfRowsInTableView เพื่อให้ table มาอ่านข้อมูลจากในนั้นอ่ะครับ
August 19, 2008, 6:01 pmadmin says:
คือผมยังไม่ค่อยเข้าใจคำถามอะนะครับ แต่ว่า ถ้าหากเราต้องการให้ Class ที่เราเขียนขึ้นเป็น datasource ให้กับ table นั่นก็แปลว่า Class ที่เราจะเขียนมันจะต้องมี numberOfRowsInTableView และ tableView:objectValueForTableColumn:row:
August 20, 2008, 1:07 amhttp://khajochi.myopenid.com/ says:
>> คือผมยังไม่ค่อยเข้าใจคำถามอะนะครับ แต่ว่า ถ้าหากเราต้องการให้ Class ที่เราเขียนขึ้นเป็น datasource ให้กับ table นั่นก็แปลว่า Class ที่เราจะเขียนมันจะต้องมี numberOfRowsInTableView และ tableView:objectValueForTableColumn:row:
ครับผม ที่ผมสงสัยคือพอผมจะเริ่มต้นเขียน class ที่เป็น data source น่ะครับ ผมจะทราบได้ยังไงว่าต้อง implement method ชื่ออะไร เพื่อให้ทำงานได้ .. จะต้องไปเปิด document หรือ class reference ตัวไหนรึเปล่าครับ
พอดีเริ่มเขียนแบบมือใหม่น่ะครับ เลยไม่ทราบว่าต้องเขียน method ตัวไหนบ้าง เลยอยากทราบที่มาว่าต้องไปหาจากหนังสืออะไรก่อนรึเปล่าครับถึงจะรู้ชื่อ method นี้
August 20, 2008, 3:15 pmadmin says:
ต้องอ่านจาก document นะครับ ตัวอย่าง class ที่ต้องการ datasource อีกตัวอย่างก็ได้แก่ NSComboBox
February 24, 2009, 10:53 amhellish says:
พี่ครับ ผมอยากทราบว่า จะดูตรงไหนว่าเป็นmethod ใช่ -(id) หรือ -(IBAction) AddRecord :
อย่างงี้ใช่ไหมครับ อยากให้อธิบายว่าส่วนไหนเป็นตัวแปรด้วยอ่ะครับ
ปล.ช่วยหน่อยนะครับ แบบว่าไม่เป็นเลยแถมไม่มีงบไปซื้อหนังสืออีกอ่ะครับ
March 20, 2009, 12:06 pmadmin says:
@interface ชื่อคลาส : NSObject
{
// ตัว แปร ต่างๆ ประกาศในนี้ เช่น
int a;
}
// Method ต่างๆประกาศ ตรงนี้ เช่น
-(IBAction) AddRecord:(id) sender;
@end
ลองไปอ่าน objective-c ก่อนก็ได้ครับ จะเข้าใจง่ายกว่า
March 20, 2009, 3:38 pmhellish says:
ขอบคุณมากเลยครับ
แล้วพี่พอจะมีหนังสือมที่แปลหรือป่าวครับ แบบว่าอ่านtextไม่ค่อยคร่องอ่ะครับ
แล้วถ้าเป็นtextอ่ะครับมีที่ให้ยืนบ้างหรือป่าวครับ
March 23, 2009, 10:27 amadmin says:
ภาษาไทย ไม่มีครับ ต้องอ่านจากต่างประเทศเอา
หนังสือให้ยืมก็ไม่มีครับ เล่มที่ผมมีก็ไม่ใช่หนังสือของผมเป็นของออฟฟิศ และโดยส่วนมากอ่านจากเวป
ถ้าอยากได้พวก ebook น่าจะลองถามใน forum ดูนะครับเผื่อคนอื่นอาจจะมี
ผมแนะนำนะครับว่า ถ้าอยากเริ่มเขียนโปรแกรมบน iPhone / Mac ถ้าไม่มีเงินซื้อหนังสือ
ผมก็แนะนำให้หา ebook หรือไม่ก็ต้องอ่านจากเวปต่างๆ เช่น
http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html
http://www.otierney.net/objective-c.html
http://www.cocoadevcentral.com
และอีกหลายๆที่
March 23, 2009, 10:38 amhellish says:
ขอบคุณมากครับผม
March 23, 2009, 11:51 amadirak says:
ขอคุณครับ สำหรับบทความดีๆ
July 2, 2009, 2:16 am