iOS 6 AutoLayout

ถ้าเราได้สร้าง ViewController ขึ้นมาใหม่โดยมีไฟล์ .xib ในไฟล์นี้ถ้าเรามีการใช้ AutoLayout แล้วเกิด Error ดังนี้ Could not instantiate class named NSLayoutConstraint ขึ้น เราสามารถแก้ปัญหาด้วยการเลือก ที่ ไฟล์ .xib แล้วไปที่ File Inspector เลื่อนลงมาด้านล่างจะเห็น Use Autolayout ถูกเลือกอยู่ให้เราทำการ uncheck ออกดังรูป ผลลัพธ์เราก็จะสามารถแสดง หน้า UI ได้ ปกติ โดยสาเหตุการเกิด error นี้เนื่องจากว่า NSLayoutConstraint นี้จะใช้ได้กับ iOS 6 แต่ถ้าเราสร้างโปรเจคที่มี target เป็น iOS เวอร์ชั่นที่ต่ำกว่า 6 จะเกิด Error

การ throw exception

  ในตัวอย่างนี้จะแสดงวิธีการ throw exception บางอย่างออกมา ในกรณีที่ต้องการตรวจสอบเงื่อนไขบางอย่าง ตัวอย่าง   int i = 1001; if(i==1001){ @throw [NSException exceptionWithName:NSInvalidReceivePortException reason:@"test12345" userInfo:nil]; }   จากตัวอย่างนี้ถ้าหาก i = 1001 จะมีการ throw exception ออกมาแต่ถ้า ไม่เท่ากับ 1001 ก็ไม่ แสดง error เราสามารถนำ @throw นี้ไปใช้กับเงื่อนไขบางอย่าง ถ้าหากไม่ตรงตามเงื่อนไขก็ให้ แสดง error ได้ ซึ่ง NSInvalidReceivePortException เป็นชนิดของ Exception ที่เกิดขึ้น

เรื่อง void , void * และ id ใน objective c แตกต่างกันอย่างไร

สำหรับสามอย่างนี้ จะแตกต่างกัน โดยแบบแรก void จะใช้บอกว่าเมธอดหรือฟังก์ชั่นนั้นๆไม่ต้อง ส่งค่า(return)กลับไป ณ จุดที่เรียกใช้เช่น -(void)printData{ } ส่วน void * จะเป็น pointer ตัวนึง คล้ายๆกับ id  “แต่” ไม่เหมือนกันซะทีเดียว โดยที่ id จะเป็น pointer ที่ชี้ไปยัง object หรือ instance ของคลาส ใน  objective-c  ส่วน  void*  จะชี้ไปยังชนิดข้อมูลทุกๆชนิด  (anything) เช่น data structure  ที่เขียนด้วยภาษา c  เป็นต้น (void* เป็น  C-Style pointer) ในการเลือกใช้งานปกติแล้ว นิยมใช้ id กันมากกว่า ตัวอย่าง การใช้งาน สมมติว่าเรามีฟังก์ชั่น 2 แบบดังนี้ void [...]

การใช้งาน Preference ใน iPhone

ถ้าต้องการเก็บค่าอะไรบางอย่างไว้ในเครื่องของเรา ก็สามารถใช้ Preference ได้  โดยเราสามารถเขียน หรือ อ่านค่าจากใน Preference  สำหรับขนาดข้อมูลที่ถูกเก็บใน Preference นั้น ไม่ควรเกิน 100K เพราะถ้าหากเกิน 100K ก็แนะนำว่าไปใช้ Core Data จะดีกว่า   ในการสร้าง Preference เราจะใช้ NSUserDefaults ดังนี้   NSUserDefaults *u = [NSUserDefaults standardUserDefaults]; [u setObject:@"test1.aa" forKey:@"loginName"]; [u synchronize];   ถ้าเราเข้าไปดูที่ /Users/your_username/Library/Preferences เราจะพบว่า Preference ของเราจะถูกสร้างโดยมืชื่อโปรเจคของเราเป็นชื่อไฟล์ตามด้วย .plist   จากนั้นการอ่าน preference ก็ให้อ่านจาก key ที่เรากำหนดไว้ตอนสร้างตัวอย่างนี้คือมี key ที่ชื่อ  loginName ก็เขียนคำสั่งดังนี้   NSUserDefaults [...]

การจัดการกับ Exception ใน objective c

ในภาษา  java จะใช้ try-catch-finally ในการจัดการกับ Exception สำหรับภาษา objective c ถ้าเราต้องการดักจับ Exception เพื่อดูว่าโค้ดส่วนไหนมีโอกาสจะเกิด Error บ้าง เราจะใช้ NS_DURING (เทียบได้กับ try) , NS_HANDLER (เทียบได้กับ catch) และ NS_ENDHANDLER (เทียบได้กับ finally) ซึ่ง สำหรับ NS_ENDHANDLER จะเรียกใช้เมื่อหลังจาก Code มีการทำงานในส่วนของ NS_HANDLER แล้ว ตัวอย่าง   #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NS_DURING{ int i = 10/0; } NS_HANDLER{ NSLog(@”Error [...]

การตรวจสอบคลาสว่ามี method ที่กำหนดหรือไม่

เราสามารถใช้ respondsToSelector ในการตรวจสอบได้สมมติว่าคลาสของเรามีเมธอดดังนี้   #import <Foundation/Foundation.h>   @interface Test : NSObject   -(int)  returnInt;   @end       แล้วใน main เราต้องการรู้ว่าคลาส Test มีเมธอดที่ชื่อ returnInt หรือไม่เราสามารถเขียน คำสั่งตรวจสอบได้ดังนี้   int main (int argc, const char * argv[]) {   Test *t =[[Test alloc]init]; if([t respondsToSelector:@selector(returnInt)]==YES){ NSLog(@”YES”); }else{ NSLog(@”NO”); } return 0; }   ถ้า return YES [...]

การใช้งาน AsyncTask

Async Task จะช่วยให้เราสามารถจัดการกับ background process ต่างๆและ สามารถส่งค่ากับไปที่ UI Thread โดยที่เราไม่จำเป็นต้องใช้ Thread หรือ Handler เลย เช่น เราต้องการคำนวน % การโหลด ข้อมูล ซึ่งช่วงระหว่างการคำนวน % เราก็สามารถเขียน ส่วนนี้ไว้ใน background process จากนั้น ถ้าหากเรามี progress bar เพื่อแสดงสถานะ download เราก็ส่งค่าที่ได้จากการคำนวนมาให้ progress bar ได้ และถ้ามีการคำนวน % เสร็จหมดแล้ว เราต้องการแสดงผลลัพธ์ “download completed” ไปให้กับ Label เราก็สามารถส่งผลลัพธ์ออกมาเป็น String ได้ สำหรับตัวอย่างนี้จะแสดงการ บวก ตัวเลขแล้วส่งผลลัพธ์กลับมา เริ่มแรกสร้างคลาสขึ้นมาก่อนดังนี้

  สร้างคลาสที่ชื่อ MyCalculator ขึ้นมาโดยจะต้องทำการ [...]

ตัวอย่างการตรวจสอบมือถือ Android ของเราว่า รองรับ Feature อะไรบ้าง

ตัวอย่างการ ตรวจสอบมือถือของเราว่า รองรับ Feature อะไรบ้าง   ในการตรวจสอบต่างๆเช่น มีกล้องหน้าหรือไม่ , มี NFC หรือไม่ เราสามารถใช้ เมธอด hasSystemFeature ได้ภายใน เมธอดนี้ก็ให้เรียก PackageManager ตามด้วยชื่อ feature ต่างๆ ตัวอย่าง public boolean checkCamera(){ return getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA); } public boolean checkNFC(){ return getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC); } public boolean checkFrontCamera(){ return getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT); } จากเมธอดต่างๆนี้ ถ้า เครื่องเรารองรับ feature ไหนก็จะ แสดงค่า true ถ้าไม่รองรับก็จะแสดง false  นอกจาก feature ต่างๆตามตัวอย่างนี้แล้ว เรายังสามารถตรวจสอบ feature อื่นๆอีกเยอะแยะได้ [...]

การดึงข้อมูลมาจาก json array

  สมมติว่าเราเรียกใช้ rest service สักตัวนึง ซึ่งมีการ return ค่ากลับมาเป็น  ข้อมูล JSon Array เช่น   [{"StudentID":"12345","StudentName":"John"}, {"StudentID":"67890","StudentName":"Jame"} ]   แล้วเราต้องการ ดึงข้อมูล ใน json array นี้ เราสามารถแปลง ข้อมูลนี้ให้เป็น json object ก่อน แล้วค่อยดึงข้อมูลได้ดังนี้   JSONArray jArray = new JSONArray(responseData);  // ตรง responseData เป็นข้อมูลที่ถูกส่งมาจาก rest service ซึ่งอยู่ในรูปแบบ JSON Array ตาม format ด้านบน JSONObject jObj=null; String  stuID; String   stuName; for(int i [...]

การส่ง ข้อมูล JSON แบบ POST ไปที่ REST

  สมมติว่าเรามี rest service ตังนึงแล้วเราต้องการที่จะเรียกใช้ rest service ตัวนี้โดยส่งข้อมูลที่อยู่ในรูปแบบ json ไปด้วย เราก็สามารถที่จะใช้คลาส HttpPost แล้วทำการ กำหนดค่า header ให้เป็น  application/json ได้ ตัวอย่าง   String responseData; int responseStatusCode;   public String callRest() { try { HttpPost request = new HttpPost( “url”); //ตรง url  เป็น path ของ rest service ของเรา request.setHeader(“Content-type”, “application/json”); JSONObject json = new JSONObject(); json.put(“StudentID”, “12345″); json.put(“StudentName”, [...]