設定日期輸出格式

設定日期輸出格式

想要改變日期輸出的格式可以使用NSDateFormattersetDateFormat,根據Date Formatters網頁提供的輸入的規格與在iOS上比對之後,大略上與網頁的差不多。

年:yyyy 月:MM 日:dd 時:hh(12小時制),HH(24小時制) 分:mm 時制:a (AM/PM)

例1:

預計的日期輸出格式為:年/月/日 時(24小時制):分,所以要輸入:yyyy/MM/dd HH:mm

//-----------start-----------
    NSDate *today = [NSDate dateWithTimeIntervalSinceNow:0];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy/MM/dd HH:mm"];
    NSLog(@"date: %@", [dateFormat stringFromDate:today]);
//------------end------------

輸出結果: (繼續閱讀…)

 Objective-C 快速參考

Objective-C 快速參考

Objective-C是利用幾個重要的觀念和C一些語法構成,然後再配合Foundation Framework完成最基本的Objective-C的環境在iOS或OSX上執行的APP,所以在文中只針對Objective-C提供的特性去做說明,Foundation Framework就歸類於Framework再做介紹。

呼叫方法 (Calling Methods)

基本方法

Objective-C在呼叫方法時是以訊息的方式傳遞,而方法如果有參數時就必需要以:冒號隔開。

//-----------start-----------
[object method];
[object methodWithParameter:parameter];
//------------end------------

(繼續閱讀…)

 NSData轉Byte、Byte轉NSData

NSData轉Byte、Byte轉NSData

NSData提供可以儲存任意字元資料的物件,它提供了介面來使用儲存的資料,所以程式在物件的環境中會更方便,記憶體管理也更容易,不過有時候與C程式要互通時,還是必需要轉成Byte方式給C程式使用,所以下面將針對這兩種型別轉換做介紹。

NSData 轉 Byte

這裡假設有個檔案為danny.bin,我們利用NSData將檔案讀入並且轉成Byte陣列,這裡要注意的是,在C裡面並沒有Byte的類型,而是用unsigned char的方式。

//-----------start-----------
    unsigned char *cData;
    NSData* nsData=[NSData dataWithContentsOfFile:@"danny.bin"];
    cData = malloc([nsData length]);
    [nsData getBytes:cData];
//------------end------------

(繼續閱讀…)

 C 字串與 NSString 互轉

C 字串與 NSString 互轉

C 字串(String)使用的是 char 類型,將每個char串連起來利用指標型式成為字串,Objective-C使用的是NSString,它是利用物件的方式存放整個字串,預設是使用Unicode 16bit存放,通常叫他 unichar ,所以在C String與NSString中間需要轉換,下面範例會介紹兩種互轉的方式。

  • NSString to C String (NSString to String)

Apple官方NSString Class文件中有提到UTF8String的NSString method,轉換完成後會在最後加個NULL當做字串的結尾,也符合C字串陣例的存放原則。

UTF8String
Returns a null-terminated UTF8 representation of the receiver.

所以:

//-----------start-----------
NSString nstr=@"Danny123";
const char *str=[nsstr UTF8String];
//------------end------------

  • C String to NSString (String to NSString)

方法1:

Apple官方NSString Class文件中有提到stringWithUTF8String,轉換後會返回使用UTF8編碼的C陣列。

stringWithUTF8String:
Returns a string created by copying the data from a given C array of UTF8-encoded bytes.

程式:

//-----------start-----------
NSString *new_nstr=[NSString stringWithUTF8String:databaseName];
//------------end------------

方法2:

Apple官方NSString Class文件中有提到stringWithCString:encoding,轉換後會返回使用指定編碼的C陣列。

stringWithCString:encoding:
Returns a string containing the bytes in a given C array, interpreted according to a given encoding.

程式:

//-----------start-----------
   NSString *new_nstr=[NSString stringWithCString:databaseName encoding:NSUTF8StringEncoding];
//------------end------------

在Objective-C中的C String存放都是以UTF-8編碼,所以整個轉換過程必需要以UTF-8為主。

 檢查檔案是否存在

檢查檔案是否存在

檢查檔案是否存在則是使用NSFileManager的fileExistsAtPath並將要檢查的檔案完整路徑傳入來驗證檔案存在性與否。 例如:有個存於Documents目錄並叫1.txt的檔案,要檢查它是否存在時就必需先知道它的完整路徑:

//-----------start-----------
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filepath=[documentsDirectory stringByAppendingPathComponent:@"1.txt"];
//------------end------------

所以整個路徑就是:

/Users/danny/Library/Application Support/iPhone Simulator/6.0/Applications/BC7239AA-D727-4D8C-B986-B5A55F8C781D/Documents/1.txt

之後再將存有完整路徑的filepath傳至fileExistsAtPath讓它檢查檔案是否存在。

//-----------start-----------
   if ([[NSFileManager defaultManager] fileExistsAtPath:filepath]){
        //這裡放置如果檔案存在時的程式
    }else{
        NSLog(@"檔案不存在!");
    }
//------------end------------

 取得Temp完整路徑

取得Temp完整路徑

有時需要建立暫存檔時,就可以使用iOS為每個APP提供的temp目錄,要得知完整路徑其實很簡單,Framework中提供NSTemporaryDirectory()來得知暫存檔的完整路徑,並輸出NSString的格式內容。

//-----------start-----------
NSLog(@"%@\n",NSTemporaryDirectory());
//------------end------------

輸出結果:

/Users/danny/Library/Application Support/iPhone Simulator/6.0/Applications/BC7239AA-D727-4D8C-B986-B5A55F8C781D/tmp/

 取得Documents目錄的路徑

取得Documents目錄的路徑

iOS系統中,每個APP都有獨立的儲存環境,在程式建立時也會建立Documents目錄,所需要保存的都可以存放在這,系統備份或還原時Documents都會被處理。

字串格式路徑

//-----------start-----------
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,   NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSLog(@"%@",documentsDirectory);
//------------end------------

輸出結果:

/Users/danny/Library/Application Support/iPhone Simulator/6.0/Applications/BC7239AA-D727-4D8C-B986-B5A55F8C881D/Documents

URL格式路徑

//-----------start-----------
    NSFileManager* fileManager = [NSFileManager defaultManager];
    NSArray* pathArray = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:YES];
    NSURL* documentDirURL = [pathArray objectAtIndex:0];
    NSLog(@"%@",documentDirURL);
//------------end------------

輸出結果:

file://localhost/Users/danny/Library/Application%20Support/iPhone%20Simulator/6.0/Applications/BC7239AA-D727-4D8C-B986-B5A55F8C881D/Documents/

 所有標頭檔案都引入指定的標頭檔(.h)

所有標頭檔案都引入指定的標頭檔(.h)

在每個CODE中都必需要引入固定的標頭檔時,不想要每一次都手動加的話該怎麼辦? Xcode建立時都會有一個預先處理的檔案,名為xxxx-Prefix.pch,xxxx為你的Project名稱,利用這個內容,將每個 CODE中都需要的標頭檔寫在這個檔案就可以完成,我們打開並看它的內容:

(繼續閱讀…)

 註解pragma的使用

註解pragma的使用

Xcode環境會有選單可以快速的跳至函數或是宣告,尤其在整個code慢慢的增加時是個非常不錯的功能,其中有2種方式用法,一種是在 註解 使用,一種是在 程式碼中分段落

註解使用

如果在註解的地方使 關鍵字+冒號 的格式:

MARK:
TODO:
FIXME:
!!!:
???:

就會顯現

(繼續閱讀…)