iPhone Programming I : Start Again

หลังจากที่ได้ทดลองเขียน iphone กันไปแบบมั่วๆแล้ว จาก tutorial ที่ผ่านๆมา และวันนี้เราน่าจะได้รู้เกี่ยวกับ iPhone SDK กันก่อนสักนิด ว่า Cocoa Touch ที่ใช้เขียนกันนั้น มันต่างจาก Cocoa ปกติอย่างไร และก็เรื่องเล็กๆน้อยๆ เกี่ยวกับ iPhone Project รวมถึง Tools ต่างๆ

Cocoa & Cocoa Touch

อย่างที่ผมได้บอกไปแล้วว่า ถ้าหากเราต้องเขียนโปรแกรมด้วย Objective-C แล้วนั่นก็หมายถึงว่าเราต้องเขียนด้วย Cocoa Framework และถ้าเป็น iPhone ก็จะเป็น Cocoa Touch ซึ่งเป็น Framework ขนาดเล็กกว่าและเพิ่มเติมในบางส่วน สิ่งที่ควรจะรู้เกี่ยวกับ iPhone และ Cocoa Touch นั้นก็คือ

  • iPhone นั้นสามารถใช้งานได้เพียง 1 โปรแกรม
  • iPhone มีหน้าขนาดหน้าจอที่จำกัด
  • เราไม่สามารถเข้าไปใช้ File ของ App ตัวอื่นๆได้นอกจาก App ของมันเอง
  • Cocoa Touch ไม่มี Garbage Collection
  • Cocoa Touch ไม่มี Binding
  • Cocoa Touch ไม่มี Core Data ( ตอนนี้มีใน SDK 3.0 แล้ว ) 
  • iPhone มีทรัพยากรณ์ที่จำกัด ram , diskspace , cpu

New Project

อย่างที่ได้บอกไปว่า ครั้งก่อนผมได้ทดลองเขียน iPhone กันแบบมั่วๆไป และครั้งนี้เราจะมาทำความเข้าใจเกี่ยวกับ iPhone Project กันมากขึ้น โดยเริ่มจาก การสร้างโปรเจคกันเลย ถ้าหากเราเปิด Xcode ขึ้นมาและเริ่มสร้างโปรเจค จะพบว่า มีหลายๆ Template ให้เลือก ดังรูปภาพ

project

แต่ละโปรเจคนั้นก็จะมีรายละเอียดต่างๆ ดังนี้

  • Navigation-Based Application
    ก็แปลตรงตัวเลยครับคือ เป็นโปรเจคที่แสดงในรูปแบบ Navigation ( จะเป็นลักษณะ Heirachy คือมีลำดับ )
  • OpenGL ES Application
    แบบนี้ก็ใช้เขียน Appplication จำพวก Game
  • Tab Bar Application
    โปรเจคแบบนี้จะมี Tab เป็นตัวเปลี่ยนหน้าต่างไปมา โดยไม่ได้เรียงลำดับเหมือน Navigation
  • Utility Application
  • View-Based Application
    แบบนี้เป็นโปรเจคที่มี view เพียงอันเดียว ** โดยส่วนมากใน tutorial ผมจะใช้อันนี้ **
  • Window-Based Application
    โปรเจคแบบนี้จะเป็นพื้นๆเลยครับ คือมี Application Delegate มาให้แค่นั้นเอง

Files

เมื่อเราได้สร้างโปรเจคขึ้นมาจะพบว่ามี File ต่างๆมากมายดังที่ผมเคยได้อธิบายไป ใน post ก่อนๆ แต่อาจจะอธิบายขาดหายไปในบางส่วน ครั้งนี้ก็อธิบายให้ครบเลยละกัน

xcode_project

จากรูปข้างบน จะเห็นว่ามี File ต่างๆมากมาย อันได้แก่

  • .m และ .h ไฟล์สองแบบนี้ก็คือ Header กับ Source นั่นเหละครับผมไม่แน่ใจว่า ภาษาอื่นๆ เค้าประกาศ Class กันแบบแยก Header – Source แบบนี้หรือเปล่า แต่ถ้าเป็น C/C++ ไฟล์จำพวก .h จะเป็น Header เอาไว้ประกาศ Class ส่วน .m และ .c และ .cpp จะเป็น ส่วนของ implement.
  • .pch เรียกว่า pre compile header ครับไฟล์นี้จะรวมรายชื่อ header ของ framework อื่นๆที่ต้องใช้ในโปรเจคและทำการ pre compile ก่อน เพื่อลดเวลาในการ compile
  • .framework เป็น Library นั่นเอง
  • .plist ไฟล์นี้เป็น property list ครับ เก็บค่า property ของ application ของเราเช่น บอกว่า icon ของ app ใช้ resource file ไหน
  • .xib เป็น interface สำหรับโปรแกรมของเรา
  • .app  ก็คือตัว Appication ของเรานั่นเหละครับ

Interface Builder

ทุกครั้งที่เราจะต้องออกแบบหน้าตาโปรแกรมของเรา เราจะใช้ interface builder และแน่นอนว่า File ที่เกี่ยวข้องก็คือ .xib นั่นเอง เว้นแต่ว่าเราจะเขียนโปรแกรมที่ต้องใช้ พวก OpenGL เราก็แทบจะไม่ต้องใช้ interface builder เลย และเมื่อเราได้ double click ที่ .xib ของเราจะเห็นหน้าตาของโปรแกรม interface builder ดังรูป

interface_builder

จริงๆหน้าต่าง ของ interface builder สำหรับ iPhone นั้นก็แทบจะไม่ได้ต่างจาก การเขียน application ปกติสักเท่าไหร่ แต่ถ้าดูดีๆ จะเห็นว่า หน้าต่าง inspector นั้นจะมีแค่ 4 tab เท่านั้นเอง

inspector

นั่นก็คือ Attributes , Size , Connection , Identity ซึ่งจะพบว่าสิ่งที่ขาดไปก็คือ Binding , Effect , ApplcScript

Xib File

และถ้าเราดูตรง Document Windows จะเห็นว่า มี Object อยู่สองตัวเสมอๆ คือ File’s Owner กับ First Responder

xib

ความสำคัญของ Object 2 ตัวนี้ก็คือ

  • File’s Owner เป็นตัวแสดงถึง Object ที่ได้โหลดไฟล์ Nib ตัวนี้หรือพูออีกอย่างก็คือเป็นเจ้าของ Nib นั่นเอง
  • First Responder นั้นเป็น เป็น Object ที่จัดการ interaction ของ object ที่กำลังโดนกระทำอยู่ ณ ขณะนั้น คือยกตัวอย่างเช่นถ้าหากเรากำลังพิมพ์ข้อความใน textbox นั่นก็แปลว่า textbox คือ responder นั่นเอง และถ้าหากเราเปลี่ยนไปกดปุ่ม ปุ่มก็จะกลายเป็น  responder แทน และ First Responder  นี้ก็จะช่วยให้โปรแกรมรู้ได้ว่า Object ไหนควรจะถูก responder นั่นเอง

เมื่อเราได้สร้างโปรเจคโดยให้ชื่อว่า Test และเลือกแบบ View-Based Application จะเห็นว่ามี .xib ทั้งหมดสอง files ด้วยกัน ( ดูจากรูป ที่ 2 ) นั่นคือ MainWindows.xib กับ TestViewController.xib และถ้าเราเปิด MainWindows.xib ขึ้นมาเลือกไปที่ File’s Owner จะพบว่า Object ที่โหลด xib ตัวนี้ก็คือ UIApplication ดังรูป

mainowner

และถ้าเรากดดูที่ Test View Controller ( icon ทีเป็นรูป วงกลมแล้วมีสี่เหลี่มตรงกลาง ) ก็จะเห็นหน้าตา interface แบบนี้

maininterface1

ถ้าหาก เรามาลองเดาจาก interface จะมีข้อความตรงกลางที่เขียนว่า Loaded From “TestViewController.xib” ที่เห็นตรงนี้ก็น่าจะพอจะตีความได้ว่า View ที่ Test View Controller ตัวนี้เป็นตัวควบคุม จะต้องไปโหลดจาก TextViewController.xib แน่นอน แล้วเราก็ลองเปิด TestViewController.xib กันขึ้นมาดู แล้วกดไปที่ File’s Owner

viewowner

จะเห็นได้ว่า File’s Owner ก็คือ TestViewController นั่นเอง

น่าจะพอเข้าใจ File’s Owner กันนะครับ สรุปก็คือเป็น Object ที่แสดงว่า ใครเป็นคนโหลด xib ตัวนี้นั่นเอง

iPhone Simulator

เมื่อเราได้เขียนโปรแกรมเรียบร้อยแล้ว และทำการ compile ไปแล้วนั้นจะพบว่า Xcode จะเปิด application ตัวใหม่ขึ้นมานั่นก้อคือ iPhone Simulator ตัว simulator นี้ผมคิดว่าเป็น  simulator ที่ดีที่สุดของการพัฒนาโปรแกรมบนมือถือเลยก็ว่าได้ ( ถ้าใครได้ลองเขียนโปรแกรมพวก Symbian จะพบว่าตัว simulator ของมันแย่มากๆ )  เพราะว่ามันแทบจะไม่ต่างอะไรกับของจริงเลย และเรายังสามารถปรับเปลี่ยน Version หรือ จะหมุนซ้าย หมุนขวา หรือแม้กระทั่ง จำลอง Memory Warning ได้ด้วย

simulator

และถ้าเริ่มเขียนโปรแกรมไปเยอะแล้ว ไม่รู้ว่าจะลบโปรแกรมที่เขียนไปได้ยังไง ก็ดูตามรูปได้เลยครับ คือเข้าไปยัง เมนูและเลือก reset

reset

วันนี้จบเพียงเท่านี้ แนะนำติชม คอมเม้นได้ครับ

Cocoa Programming IV : Array Controller

เมื่อวันก่อนๆ ได้เรียนรู้เกี่ยวกับ การใช้งาน Binding และ MVC กันไปแล้วสำหรับวันนี้จะได้นำมาใช้กับ NSArrayController กัน

ก็อย่างที่บอกไปแล้วว่าการเขียนโปรแกรมด้วย Cocoa นั้นค่อนข้างจะมีการใช้งาน MVC ค่อนข้างเยอะ และ code ส่วนมากก็คือการนำ data มาแสดงผล ซึ่ง class ที่ต้องเกี่ยวข้องก็คือ Controller ( Model – View – Controller )

NSController ก็คือ Class ที่ช่วยให้เราลดการเขียน Glue Code ( class ที่เป็นตัวเชื่อมในการนำข้อมูลออกมาแสดงผลที่ interface ) แต่ class ที่เราจะทดลองใช้กันจริงๆก็คือ NSArrayController ซึ่งเป็น subclass ของ NSController และวันนี้เราจะได้มาสร้างโปรแกรมง่ายๆกัน นั่นคือ โปรแกรมที่เอาไว้เก็บ คะแนน ของนักเรียน เหมือนดังที่เราได้ทดลองเขียนกันในตอนใช้งาน NSTableView ครั้งก่อนๆ

เริ่มเลยละกัน ก่อนอื่นเราก็สร้าง Cocoa Application โปรเจคขึ้นมาใหม่ โดยให้ชื่อว่า StudentScoreReport ดังรูป

newproject

และหลังจากนั้นเราก็ เพ่ิม class ที่ชื่อว่า AppController เหมือนเดิม แล้วก็เพ่ิม class ที่มีชื่อว่า StudentData เข้าไปด้วย

addclass

ส่วน Source Code ของ ทั้งสอง class ก็มีดังนี้

AppController.h

AppController.m

จาก code ข้างบนจะเห็นว่า AppController นั้นมีแค่ ตัวแปรเดียว คือ m_studentList ที่เป็น Mutable Array เท่านั้น และในส่วนของ code ก็ไม่มีอะไรเลย นอกจาก init และ dealloc เท่านั้นเอง

StudentData.h

StudentData.m

จาก code ในส่วนของ StudentData นั้นเราได้มี ตัวแปรสองตัวที่เอาไว้เก็บ ชื่อ และ คะแนน ของนักเรียน จะเห็นว่า code ของทั้งสอง class นั้น แทบจะเรียกว่าไม่มีอะไรเลย นอกจาก การ init และ dealloc เพียงเท่านั้นเอง หลังจากนั้น เราก็เปิด MainMenu.xib ขึ้นมา เพื่อออกแบบ interface แล้วเราก็ออกแบบหน้าตาให้มีประมาณแบบนี้

interface

เมื่อเราออกแบบเสร็จแล้วขั้นตอนต่อไปก็ทำเหมือนๆ เคยนั่นก็คือ เพ่ิม AppController Object เข้ามา ดังรูป

appcontroller1

ลำดับต่อไปก็คือ เราจะเพ่ิม Array Controller เข้ามายัง xib ของเรา โดยที่เราก็ลาก Array Controller จาก Library เข้ามา ก็จะเห็นดังรูป

array

แล้วเมื่อเรามี Array Controller แล้ว ต่อมาเราก็จะ set attribute ของ Array Controller ของเรากัน สิ่งที่เราจะต้อง set ก็คือ Object Controller เราก็เลือกเป็น StudentData และเราก็เพ่ิม key เข้าไป 2 key นั่นก็คือ m_name  และ m_score ตามรูป

attributes

ที่เราได้ทำไปนั้น คือเป็นการบอกว่า ให้ Array Controller ตัวนี้จัดการกับ StudentData และเราก็ได้ เพิ่ม key เข้าไปเพื่อให้ Array Controller ของเราได้ เข้าสู่ข้อมูลของ StudentData ได้นั่นก็คือ m_name และ m_score

หลังจากนั้นเราจะ Bind Array Controller เข้ากับ App Controller เพื่อให้ Array Controller ตัวนี้จัดการ array โดยมี m_studentList เป็นตัวเก็บข้อมูล

bind_key

เมื่อเสร็จตรงส่วนี้แล้ว เราก็จะไป Bind ข้อมูลในตรางที่เราได้สร้างขึ้นมา กับ Array Controller ของเรา วิธีการก็คือ เลือกไปที่ Column ของ Table แล้วก็ตั้งค่าของ Value ให้มี Control Key เป็น arrangedObjects และ Model Key Path เป็น m_name ดังรูป

bind_name

และอีก Column ก็ทำเหมือนกัน แต่เราเปลี่ยน Model Key Path ให้เป็น m_score ดังรูป

bind_score

เพียงเท่านี้ก็เป็นอันเสร็จ ขึ้นตอนการ Bind

สรุป

  • เราได้ Bind – Array Controller ของเราเข้ากับ App Controller โดยมี m_studentList เป็น key
  • และเราก็ได้ Bind ค่าที่จะแสดงผลที่ Table เข้ากับ Array Controller โดยใช้ m_name และ m_score เป็น key

แต่ยังไม่เสร็จ เหลือส่วนสุดท้ายก็คือ Button ของเรานั่นเอง อย่างที่บอกไปแล้วว่า Array Controller  ของเรานั้นจัดการ Array ให้เราตั้งแต่ Add, Remove, Insert ข้อมูล ดังนั้นเราก็ไม่ต้องไปเขียน method พวกนี้ ( ลดการเขียน Glue Code )

เพียงแค่เราเชื่อม Action ที่ต้องเรา เข้ากับ ปุ่มที่เรามี เพียงเท่านี้ก็ใช้งานได้  ดูรูปประกอบ

link_action

จากรูป ข้างบน เราได้เชื่อม Received Action – add เข้า ปุ่ม Add ของเรา และ ก็เชื่อม Received Action – remove เข้ากับปุ่ม Remove เพียงเท่านี้ก็เสร็จ

ลอง Compile ดูครับ แล้วเราก็จะพบกับ หน้าต่าง Windows เหมือนดังรูป

result1

ก็ลองกด Add ดูครับ จะเห็นว่า มี item เข้าไปยังตาราง แล้วเราก็ยังแก้ไขข้อมูล โดยการกด click ไปที่ตาราง และก็สามารถ remove item ได้ด้วย

จากโปรแกรมที่เราได้ลองเขียนไป จะเห็นว่าเราไม่ต้องไปเขียน method ที่ต้องเกี่ยวกับการจัดการข้อมูลของ Array รวมถึงการ จัดการข้อมูลที่ต้องแสดงในตารางเลย เพราะว่าเราได้ใช้ Binding , Key Value และการใช้ Property เข้ามาช่วย เราจึงลดการเขียน Glue Code ลงไปได้เยอะมาก ลองเปรียบเทียบกับที่เราได้เขียน Application ที่คล้ายกัน ตอนเมื่อผมเขียนการใช้งาน NSTableView ดูครับ

มีคำแนะนำติชม ก็เขียนเม้นกันครับ

Cocoa Programming IV : More about – Binding & Property

Technology อย่างหนึ่งของ Cocoa ก็คือการ Binding และในวันนี้ผมจะอธิบาย Cocoa Binding รวมถึงตัวอย่างการใช้งาน แบบง่ายๆ กัน

MVC – Model View Controller

โดยปกติแล้วการเขียนโปรแกรมด้วย Cocoa เราจะใช้ MVC ( Model View Controller ) design pattern ในการเขียนโปรแกรมค่อนข้างเยอะมาก อาทิเช่น Bindings , Core Data เป็นต้น เราจะมาทำความเข้าใจกันก่อนว่า MVC คืออะไร

  • Model พูดง่ายๆว่าคือ ข้อมูล อาจจะรวมไปถึงวิธีการเก็บข้อมูลด้วย เช่นเราเขียนโปรแกรมที่ต้องการ เก็บคะแนนวิชาเลขของนักเรียน เราอาจจะมี เขียน Class ขึ้นมาชื่อว่า Student เพื่อเอาไว้เก็บคะแนนและชื่อของนักเรียน
  • View ก็คือส่วนที่เอาไว้ติดต่อผู้ใช้ GUI นั่นเหละครับ ยกตัวอย่างเช่น NSButton เป็นต้น
  • Controller คือส่วนของการควบคุม หรือส่วนกลางระหว่าง ข้อมูลกับ GUI ยกตัวอย่างเช่น อาจจะเป็น Class ที่มี Method ที่เอาไว้ควบคุมการ add / remove รายชื่อนักเรียนเป็นต้น

และในการเขียนโปรแกรมด้วย Cocoa นั้นจะพบว่าเราต้องเขียน Class ในลักษณะ MVC ค่อนข้างเยอะมาก ดังนั้นจึงได้มี Binding เข้ามาเพื่อช่วยให้ลดการเขียน Class จำพวก Controller

Binding

จริงๆแล้วผมได้อธิบายไว้ใน http://www.macfeteria.com/2008/08/cocoa-programming-iii-key-value/ แล้วแต่จะขอยกตัวอย่างง่ายๆอีกสักตัวอย่าง เพื่อให้เข้าใจ Binding กันมากขึ้น โดยครั้งนี้เราจะ Binding ให้เข้ากับ Property ของ Class ที่เราได้เขียนไว้

การ Binding คือการที่เรานำ key (หรือตัวแปร) เชื่อมกับค่า attribute ต่างของ Object ที่เอาไว้แสดงผล เช่นสมมติว่า หน้าตาโปรแกรมดังรูป

interface

เพื่อความเข้าใจ เรามาลองเขียนโปรแกรมทดลองกันเลยดีกว่า โดยเริ่มจาก สร้างโปรเจคขึ้นมา โดยให้ชื่อว่า Binding

หลังจากนั้นเราก็ออกแบบหน้าตาโปรแกรมให้มีลักษณะดังกล่าว ต่อไป เพิ่ม class ที่ชื่อว่า AppController เหมือนที่เราเคยทำมาเช่นเดิม

project

ต่อไปเราก็เขียน Code ของ AppController.h  ดังเช่นข้างล่าง

และส่วน Code ของ AppController.m ก็มีดังนี้

จะเห็นว่าตัวอย่างโปรแกรม ก็ทำงานอย่างง่ายๆคือ มี ตัวแปร ที่ชื่อว่า m_position และมี IBOutlet อีกสองอย่างคือ NSButon กับ NSTextFields เท่านั้นเอง ส่วน code ของ implement นั้นก็มีเพียง Function ทีชื่อว่า GetPosition เท่านั้นและหน้าที่ของฟังก์ชั่นนี้ก็ไม่ได้ทำอะไรมาก นอกจาก set ค่า String เข้าไปยัง m_text แค่นั้นเอง

หลังจากนั้นก็เปิด Interface Builder แล้วก็ add  object ของ AppController เข้ามาดังรูป

appcontroller

ต่อไปคือ การ link NSButton เข้ากับ m_button และ NSTextFields เข้ากับ m_text เข้ากับ interface เหมือนที่เคยทำมา ดังรูป

linkobj

และก็ link Function ที่เราได้เขียนไว้ นั่นคือ GetPostition เข้ากับ Button เหมือนดังรูปภาพข้างล่าง

getposition

ต่อไปส่วนที่สำคัญมาก ก็คือเราจะ Bind ตัวแปร m_position ให้เข้ากับ ตำแหน่งของ slider วิธีการ ก็ไม่ยากครับ ก็คือเราก็กลับไปที่ Interface Builder แล้วก็เปิด Inspector ขึ้นมา จากนั้นก็เลือกไปที่ Slider ที่เราได้ออกแบบไว้ แล้วเลือกไปที่ Binding Inspector ก็จะเห็น หน้าต่างเหมือนดังรูป

binding

สิ่งที่จะต้องทำการ setting ก็คือ ในส่วนของ Value เราก็เลือก Bind To: ไปที่ App Controller แล้ว Model Key Path ของเรา ก็ใส่ m_position ลงไป
จากที่เราทำไป ก็เป็นการบอกว่า เราจะ Bind Value ของ Slider ไปยัง App Controller แล้วใช้ Key ที่ชื่อว่า m_position หลังจากนั้นเราก็ ทำการ compile ครับ

จากโปรแกรม เราก็ลองเลื่อนตำแหน่ง ของ Slider ดูแล้วหลังจากนั้น เราก็ กด Get Position ดูครับ จะเห็นว่า position text จะเปลี่ยนค่าไป เหมือนดังรูป

program_a

จะเห็นว่า เราไม่ต้องไปเขียน Function ใดๆเกี่ยวกับ Slider เลย เพราะเราได้ใช้การ Binding เข้าช่วย ถ้าหากจะพิจารณากันจริงๆแล้ว โปรแกรมทำงานอย่างไร ก็ขออธิบายอย่างง่ายได้ว่า

  • จาก  AppController นั้นจะมีตัวแปร ที่ชื่อ m_position เป็น integer และเราก็ได้กำหนดให้ m_position นี้เป็น properties
  • ดังนั้นแล้ว เราก็เข้าถึง m_position โดยที่ไม่ต้อง เขียน Getter/Setter
  • ต่อไปเราก็ทำการ Binding Slider  โดยใช้ m_position เป็น key ดังนั้นเมื่อเราเลื่อน slider มันจะไปเรียก Setter/Getter ของ m_postion
  • แต่เนื่องจาก m_position ของเราเป็น property เราจึงไม่ต้องเขียน Getter/Setter

ถ้าหากเปรียบโปรแกรม ระหว่าง http://www.macfeteria.com/2008/08/cocoa-programming-iii-key-value/ ที่ได้เคยเขียนไป ก็จะเห็นว่าเราไม่ต้องเขียน Getter/Setter

Key Value Observing

จากโปรแกรม ข้างบน ถ้าหากเรามี method อื่นๆที่ทำการเปลี่ยนแปลงค่าของ m_position โดย method อื่นๆ เช่นสมมติว่าเราเพิ่ม Button ที่ชื่อว่า Increase Position เข้าไปเพื่อเพิ่มค่าของ m_position แล้ว slider จะรู้หรือเปล่า ว่าค่าได้มีการเปลี่ยนแปลง ? คำตอบก็คือ ไม่สามารถรู้ได้ ดังนั้นถ้าหากเราต้องการให้ slider นั้นรู้ว่าได้มีการเปลี่ยนแปลงค่าของ m_position จากส่วนอื่นๆ เราก็จะใช้ Key-Value Observing เข้ามาช่วย

สมมติว่าจาก โปรแกรมข้างบน เราได้เพิ่ม ปุ่มกด Increase Position เข้าไปดังรูป

interface2

และเพิ่ม IBAction method เข้าไปที่ AppController ที่มีชื่อว่า IncreasePosition: และเขียน implement ได้ดังนี้

และเราก็เชื่อม button ของเราให้เข้ากับ IncreasePosition: ใน interface builder ดังรูป

link2

แล้วลอง Compile และ Run ดู หลังจากนั้นก็ลองกด ปุ่ม Increse Position ดูครับ ตามหลักแล้วเมื่อเราเพิ่มค่าของ m_position จากการกดปุ่มที่เราได้เพิ่มเข้าไป slider ก็ควรจะเลื่อนตำแหน่งใช่ไหมครับ เพราะว่าค่าของ m_position ได้เปลี่ยนไป แต่เมื่อเราได้ run ดูจริงๆแล้ว จะเห็นว่า ไม่มีอะไรเกิดขึ้นเลย แต่ความจริงแล้วค่าของ m_position ก็ได้เปลี่ยนไปแล้วนะครับ ถ้าหากเราเปิด Console ขึ้นมาก็จะเห็น Log ว่าค่าของ m_position ได้เปลี่ยนเหมือนดังรูป

result

เอาละ แล้วเราจะทำยังไง ?

สิ่งที่เราต้องเพิ่มเข้าไปก็คือ ต้องทำให้ตัวโปรแกรมและส่วนอื่นๆรู้โดยการใช้ notification วิธีการก็ไม่ยากครับ เราเพียงแค่ เพิ่ม code เข้าไปแบบนี้

เพียงเท่านี้ก็เป็นอันเสร็จ เราลองกด Increase Position ใหม่อีกครั้ง จะเห็นว่า ตำแหน่งของ slider ก็ได้เปลี่ยนไปด้วย หรือเราอาจจะเขียนได้อีกรูปแบบคือ

ก็ใช้งานได้เหมือนกัน เพียงแต่เราได้ใช้ Key Value เข้ามาช่วย และในครั้งหน้าเดี๋ยวเราจะได้ใช้ Binding กับ Array Controller ครับ

Mac Buyer’s Guide

ไหนๆเห็นว่ามีคนถามใน forum กันเข้ามาว่า  ควรจะซื้อรุ่นไหน สำหรับการพัฒนา iphone
เอาละครับนี่เป็น Guide แบบง่ายๆ จากประสบการณ์ของผมเองว่า รุ่นไหน เหมาะสม และควรจะซื้อรุ่นไหน

สิ่งที่จะต้องพิจารณากันก็คือ แค่สอง สามอย่างครับ

  • ราคา
  • Notebook หรือ Desktop
  • การใช้งานอื่นๆ

เอาละครับ งั้นเรามาพิจารณาในเรื่อง ราคา กันก่อนเลยดีกว่า

อย่างที่บอกไปว่า Mac นั้นมีไม่กี่รุ่น และในปัจจุบันของแบ่งออกเป็น ตามราคาก็แบ่งได้ง่ายๆเลยครับคือ แค่ 2 อย่าง ราคาสูงกว่า 50,000 และราคาต่ำกว่า 50,000

งบมี ต่ำกว่า 50,000 ก็จะมีตัวเลือกแค่ประมาณ 4 – 6 รุ่น อันได้แก่

  • Mac Book 13″ ตัวใหม่
  • Mac Book White
  • iMac 2.4 Ghz
  • iMac 2.6 Ghz
  • Mac Mini 1.8 Ghz
  • Mac Mini 2.0 Ghz

ต่อไปก็พิจารณากันว่า เราจะต้องใช้เป็น desktop หรือว่า notebook  ถ้าหากว่าต้องการ เอาไปไหนมาไหน บ่อยๆ ก็คงต้องเป็น Notebook แน่นอน แต่ถ้าไม่ได้เอาไปใช้ข้างนอกบ่อยๆ ก็ควรจะเป็น desktop ถ้าถามความเห็นผมโดยไม่ได้มองว่าจะต้องหิ้วไปไหนมาไหน จาก 6 เครื่องข้างบน ผมแนะนำให้ซื้อ iMac ครับ อาจจะเป็นรุ่น 2.4 หรือ 2.6 ก็แล้วแต่ สองรุ่นี้ต่างกันประมาณ 8 พันกว่าบาท ( คิดจริงๆก็อีก 2 พัน ก็ต่างกันเป็นหมื่น ) สองรุ่นนี้ไม่ได้ต่างกันในเรื่องความเร็วกันมากนัก เอาสองรุ่นนี้มาเปรียบเทียบกันในการใช้เวลาในการ Compile โปรแกรมแล้วละก็ เรียกว่า ต่างกันไม่ถึง 10 วินาที แต่ถ้าจะมองว่า เพิ่มมา 8 พันได้ การ์ดจอดีกว่า cpu ดีกว่า ram มากกว่า อันนี้ก็แล้วแต่นะครับ

Mac Mini ? อันนี้ไม่ใช่คำตอบเลยครับ เพราะว่ามันช้ามากๆ แทบจะทำอะไรไม่ได้เลยด้วยซ้ำไป ถ้าต้องการเขียนเกมส์ หรือ app ที่ต้องใช้การประมวลผลเยอะๆ Mac Mini เป็นอะไรที่ทำงานแทบจะไม่ได้เลย Compile ทีก็นอนรอได้เลย และด้วยการ์ดจอที่เป็น on board และมี ram ที่น้อยนิด ผมว่าไม่คุ้มเงิน เอาเสียเลย

Mac Book ? ถ้าไม่ิติดว่าต้องถือไปไหนมาไหน ผมก็ยังเชียร์ให้ซื้อ iMac อยู่ดี ตอนนี้ดีหน่อยที่ว่า Mac book ได้เปลี่ยนการ์ดจอให้ดีกว่าเดิม แต่ถ้าเอาประสิทธิภาพ ก็ยังด้อยกว่า iMac มากๆ

งบเกิน 50,000 ไปจนถึงหลักแสน

  • iMac 2.8
  • Mac Book Pro 2.4
  • Mac Book Pro 2.53
  • Mac Book Pro 2.66
  • Mac Book Pro 2.8
  • Mac book Air
  • Mac Pro

และเครื่องพวกนี้ ก็เป็นราคาระดับแพง ไปจนถึงขึ้นแพงเวอร์มาก ถ้าไม่คิดเรื่องเงิน อันนี้ก็ตามแต่สะดวก แต่ผมจะขอวิจารณ์ในแง่ของการใช้งาน และความคุ้มค่าของเงิน เริ่มจาก iMac ก่อน

ถ้าจะให้เลือก แบบเหมาะสมกับราคา และประสิทธิภาพผมก็ยังเลือก iMac เพราะว่ามันได้ทั้ง spec ที่ดีและคุ้มกับเงินที่ต้องจ่าย ส่วน Mac Book Pro เท่าที่ผมได้ลองใช้งานมา ก็พบว่า มันก็ยังช้ากว่า iMac อยู่ดีนั่นเหละ แต่ถ้าต้องหิ้วไปไหนมาไหน ก็อย่างที่บอกไปว่าอันนี้ก็คงต้องตาม ความจำเป็น ในการใช้งาน

Mac Book Air ? ก็ถ้าต้องการใช้ Notebook แล้วละก็ และก็ยังลังเลว่า จะซื้อ Mac Book Pro หรือ Mac Book Air ดีกว่า ถ้ามองในการพัฒนาโปรแกรมแล้ว ซื้อ Mac Book Pro คุ้มกว่าแน่นอน เนื่องจาก Mac Book Air ได้แค่เรื่องของความบาง แค่นั้น ประสิทธิภาพสู้ Mac book Pro ไม่ได้ครับ มันอาจจะดูหล่อก็จริง แต่ผมว่าไม่คุ้มเงินเลย

Mac Pro ? อันนี้ถ้าหากต้องเอามาเขียนโปรแกรมสำหรับ iPhone อย่างเดียวผมว่า ไม่คุ้มเลยครับ คือเครื่องมันแรงก็จริง แต่มันแพงมากๆ ถ้าเป็นเครื่องระดับเกือบแสน หรือ เกินแสน ผมคิดว่ามันไม่คุ้มเงินนะครับ ถ้าต้องเอามาทำงานด้านอื่นๆด้วยเช่นทำ VDO ทำเพลง อะไรแบบนี้ก็คงต้องพิจาณากันอีกที

Mac VS PC + Hackintosh ?

หลายคนอาจจะยังเลว่า จะซื้อดีหรือเปล่า เพราะบางคนแค่อย่างจะลองเขียน แต่ไม่อยากซื้อเครื่อง Mac มาลอง ผมก็แนะนำอย่างนี้ครับ เราสามารถลง Mac OSX ในเครื่อง PC ของเราก็ได้ หรือที่เค้าเรียกว่า Hackintosh หรือ X86 ก็สามารถใช้ได้เหมือนกัน แต่วิธีการลงจะยุ่งยากพอสมควร และในเรื่องของ Hardware Compatible ด้วย ถ้าหากว่าโชคดีว่าเครื่อง PC ที่มีอยู่สามารถลงได้ก็ดีครับ ถ้าชอบคิดจะทำจริงๆจังก็แนะนำให้ซื้อ Mac ของจริงจะดีกว่า

หวังว่าคงจะได้เอาไปคิด พิจารณากัน มีความเห็นแตกต่างก็ คอมเม้นกันเข้ามาครับ

————————-

Update : 12 Mar. 09

New iMac , Mac Mini

เนื่องจากว่าวันที่ผมเขียน entry นี้นั้น iMac ตัวใหม่และ Mac Mini ยังไม่ออก แต่ปัจจุบัน  Apple ได้ออก Mac Mini ใหม่ คือรุ่น 120GB Mac mini (MB463LL/A) และ 320GB Mac mini (MB464LL/A) ซึ่งได้ปรับปรุงประสิทธิภาพ ขึ้นมาจากรุ่นก่อนมาก ตามทัศนะคติของผม คิดว่ารุ่นนี้สามารถเขียนโปรแกรม iPhone ได้สบายๆ เพราะว่ามันมีการ์ดจอ NVIDIA GeForce 9400M ที่ต่างจากรุ่นเดิมที่เป็น intel ซึ่งประสิทธิภาพค่อนข้างต่างกันมาก ถ้าใครคิดจะซื้อมาหัดเขียน iPhone ผมว่าเป็นตัวเลือกที่คุ้มค่านะครับ แต่ถ้าอยากแรงอีกหน่อย ก็ไปเล่น iMac ก็จะเยี่ยมเลยครับ

Books & Extra Stuffs

หลายๆคนเริ่มลงมือเขียน iPhone ไปบ้างแล้ว และก็ผมก็ยินดีด้วยนะครับ ถ้าหากว่า blog ของผมเป็นจุดเริ่มในการเขียนโปรแกรมสำหรับ iPhone และ Mac.

และในตอนนี้มีหนังสือ เกี่ยวกับการเขียนโปรแกรมสำหรับ iPhone ออกมาหลายเล่มทีเดียว สำหรับคนที่ยังไม่รู้ว่าควรจะซื้อเล่มไหน มาอ่าน ผมก็มีแนะนำหลายๆเล่มครับ สำหรับหนังสือ ที่ควรจะอ่านๆ ก็มีดังต่อไปนี้

Programming in Objective-C

ถ้าเพิ่งเริ่มต้นเขียนโปรแกรม ผมแนะนำให้อ่านหนังสือ การเขียนโปรแกรมด้วยภาษา Objective-C ก่อน เพราะว่าการเขียนโปรแกรม ใน iPhone ต้องใช้ภาษา Objective-C ฉนั้นแล้วถ้าไม่รู้เรื่องมาก่อนเลย แนะนำ เล่มดังต่อไปนี้

Objective-c Programming

หนังสือเล่มนี้สอนการเขียนโปรแกรมด้วยภาษา Objective-C ไว้ได้ดีมากๆ ตั้งแต่คนไม่เคยเขียนโปรแกรมมาก่อนก็สามารถอ่านได้ เหมาะสำหรับคนที่เพิ่งจะเริ่มเขียนโปรแกรมและในหนังสือ ยังได้กล่าวถึง Foundation Class ต่างๆที่ต้องรู้ อาทิเช่น NSNumber , NSArray เป็นตั้น และได้อธิบายการจัดการ Memory ในเบื้องต้นอีกด้วย

รายละเอียดของหนังสือ Programming in Objective-C

Programming in Objective-C 2.0

หนังสือเล่มนี้คนเขียนเป็นคนเดียวกัน กับที่เขียน Programming in Objective-C 2.0 เนื้อหาภายในก็ไม่ได้ต่างกันมากมายนักกับ เล่ม Programming in Objective-C แต่จะเพิ่มเติมในส่วนของ Cocoa และ iPhone ไว้ด้วย

objective2

อาจจะงงว่า Objective-C กับ Objective-C 2.0 ต่างกันยังไง อธิบายได้ง่ายๆครับว่า มันก็เป็นภาษาเดิมนั่นเหละ ครับเพียงแต่ว่า 2.0 เนี่ยจะเพิ่มคุณสมบัติของภาษาเข้ามาใหม่ อาทิเช่นในเรื่องของ Garbage Collection , Property อะไรทำนองนี้ สำหรับผมคิดว่า เล่มนี้ ครอบคลุมหมดเลยครับ สำหรับการเขียนโปรแกรมเบื้องต้น

รายละเอียดของหนังสือ Programming in Objective-C 2.0 (2nd Edition)

Advance Mac OS X Programming

หนังสือเล่มนี้เป็นการเขียนโปรแกรมสำหรับ Mac ค่อนข้างเขียนได้ดี แต่ว่ามันจะปนๆ กันระหว่าง C/C++ กับ Objective-C เนื้อหาหลายๆส่วนน่าสนใจมากๆอาทิเช่น การเขียน Share Memory Segment เป็นต้น

advance

ถ้าไม่คิดจะเขียนโปรแกรมบน Mac กะว่าจะเขียนแต่ iPhone ก็ไม่จำเป็นเท่าไหร่ครับ เพราะว่ามันไม่ได้เขียนเกี่ยวกับ iPhone หรือ Cocoa เลย หนักไปทาง Unix

รายละเอียดหนังสือ Advanced Mac OS X Programming (2nd Edition of Core Mac OS X & Unix Programming)

Cocoa Programming for Mac OS X

หนังสือการเขียนโปรแกรมด้วย Cocoa เล่มนี้นับว่าเป็นเล่มที่ดีที่สุดเลยก็ว่าได้ สอนการเขียนโปรแกรมด้วย Cocoa และการใช้งาน xcode กับ interface builder เบื้องต้น เนื้อหาเขียนได้ดีมากๆอ่านง่าย เป็นหนังสือที่ผมแนะนำเลยครับว่าต้องอ่าน เพราะมันจะปูทางไปสู่การเขียนโปรแกรมด้วย iPhone

cocoa

เหมาะกับทุกคนที่จะเขียนโปรแกรมด้วย Cocoa และตอนนี้หนังสือก็ได้ปรับปรุงมาถึง 3th edition แล้ว เนื้อหา update มากๆ

รายละเอียดของหนังสือ Cocoa(R) Programming for Mac(R) OS X (3rd Edition)

Xcode 3 Unleashed

เป็นหนังสือสอนการใช้งาน Xcode ครับ สำหรับหนังสือเล่มนี้ เนื้อหาหลายๆอย่างอยู่ในขั้นกลางๆ ไปถึงขั้นสูง จริงๆแล้วเราสามารถหาอ่าน การใช้งาน Xcode ได้จากเวปของ apple เอง แต่มันไม่ค่อยจะ update มากนัก

Xcode 3

ถ้าใครที่ต้องการ การใช้งาน xcode ในระดับ advance เช่นการ ใช้งาน Instrument หรือว่าจะเป็น SVN, CVS ก็คุ้มค่านะครับ

รายละเอียดของหนังสือ Xcode 3 Unleashed

Beginning iPhone Development: Exploring the iPhone SDK

หนังสือเล่มนี้เป็นหนังสือสอนเกี่ยวกับ การเขียนโปรแกรมสำหรับ iPhone ถ้าใครไม่รู้เรื่อง Cocoa มาก่อน ผมแนะนำให้ไปอ่าน Cocoa ก่อนครับ หนังสือเล่มนี้ สอนการใช้งาน Control ต่างๆไว้มากมาย

iphoneprogrammingbookBeginning iPhone Development: Exploring the iPhone SDK

ไม่ว่าจะเป็น button , combo box , address book ยังรวมไปถึง การใช้งาน Quartz เบื้องต้น และรวมถึงการใช้งาน multi-touch และ การใช้งานกล้องถ่ายรูปแนะนำอ่านอย่างยิ่งครับ

รายละเอียดของหนังสือ Beginning iPhone 3 Development: Exploring the iPhone SDK

The iPhone Developer’s Cookbook: Building Applications with the iPhone SDK

เล่มนี้ก็เขียนเกี่ยวกับ iPhone Programming โดยตรงเหมือนกัน แต่เล่มนี้เขียนต่างจากเล่มบนตรงที่ว่า ค่อนข้างจะลงลึกไปแต่ละ Control เช่นการใช้งาน Table ก็จะเขียนตั้งแต่การใช้งานในระดับง่าย จนถึงขั้นสูงเช่นการใส่รูปเข้าไปใน table แต่ก็ไม่ได้ครอบคลุมทุกๆ Control

The iPhone Developer's Cookbook: Building Applications with the iPhone SDK

ถ้าหากมีงบจำกัดในการซื้อ ผมแนะนำให้ซื้อเล่ม Begining iPhone Development มากกว่า แต่ก็ยังแนะนำให้อ่านเล่มนี้ครับ เพราะว่าเนื้อหาบางอย่างในเล่ม Begining iPhone Development ไม่ได้บอกไว้เช่น พวก service ต่างๆ

รายละเอียดของหนังสือ The iPhone Developer’s Cookbook: Building Applications with the iPhone 3.0 SDK (2nd Edition)

Extra Books

หนังสือที่แนะนำไปเบื้องต้นผมว่า ครอบคลุมกับ ทุกๆเนื้อหาสำหรับการเขียนโปรแกรมบน Mac , iPhone แล้วนะครับ และสำหรับคนที่สนใจใน เบื้องลึกอื่นๆ ผมยังมีแนะนำอีก

Mac OS X Internals: A Systems Approach

เล่มนี้เป็นเล่มตำนานเลยก็ว่าได้ เพราะได้เขียนเกี่ยวกับ ระบบ Mac ได้อย่างละเอียดยิบมากๆ ตั้งแต่ระดับ Kernel กันเลยทีเดียว คือถ้าใครสนใจการทำงาน ของระบบ Mac OS X ในแบบลึกซึ้ง เล่มนี้ไม่ผิดหวังแน่ๆครับ

Mac OS X Internals: A Systems Approach

เล่มนี้หนามากๆ ถ้าใครต้องการเขียนโปรแกรมบน Mac แบบลึกๆเล่มนี้ควรจะศึกษาเป็นอย่างยิ่ง

รายละเอียดของหนังสือ Mac OS X Internals: A Systems Approach

Programming with Quartz: 2D and PDF Graphics in Mac OS X

สำหรับคนที่ต้องการศึกษา Quartz Framework ( 2D Graphic Library ) เล่มนี้แนะนำเลยครับ เพราะละเอียดมากๆ ตั้งแต่การวาดเส้น ลงสี และรวมไปถึงการใช้งานขั้นสูงเช่น PDF อีกด้วย แต่ไม่มีเนื้อหาเกี่ยวกับ 3D สักเท่าไหร่

Programming with Quartz: 2D and PDF Graphics in Mac OS X

ถ้าใครต้องเขียนโปรแกรมจำพวก 3D เล่มนี้ไม่ได้สอน การเขียนโปรแกรมด้วย OpenGL เลย มีแต่ Quartz ล้วนๆ และก็เนื้อหาแบ่งเป็น Carbon กับ Cocoa อย่างละครึ่งๆ แต่หนักไปทาง Carbon ซะมากกว่า

รายละเอียดของหนังสือ Programming with Quartz: 2D and PDF Graphics in Mac OS X (The Morgan Kaufmann Series in Computer Graphics)

Web

และก็ยังมีแหล่งข้อมูลอื่นๆที่แนะนำให้เข้าไปอ่านเพิ่มเติม

  • iPhoneDevCentral.org มีหลายๆ Tutorial ให้ได้ดูกัน
  • Apple Developer Center ก็เป็นของ apple เองครับเข้าไปดูพวก example project หรืออ่าน guide ได้
  • icode blog มีหลายๆ tutorial ที่น่าสนใจมากๆ
  • Stanford CS193P Course : Course iPhone Development นี่เป็น course ของมหาวิทยาลัย standford สอนเกี่ยวกับ การเขียนโปรแกรมด้วย iPhone มีทั้ง example ครบเลย สุดยอดมากๆ

ถ้าใครมี Link หรือหนังสือแนะนำ ก็ Comment กันเข้ามาครับ

ปล. ขอโทษทีนะครับ ที่ไม่ค่อยได้ update blog สักเท่าไหร่