快還要更快!使用 NSDictionary 迭代取值法來印出 NSDictionary 全部的資料

XCode

 

NSDictionary 是 Objective-C 中一個相當好用的東西,很類似 Java 中的 Map 物件,都是以 key-Value 的方式儲存資料。Objective-c 在處理 JSON 資料時,也會將資料轉成 NSDictionary 的方式儲存。而在海芋最近使用 NSDictionary 的物件,必須將 NSDictionary 中的資料全部印出來,這時怎麼辦呢?

 

其實,在 Objective-C 中,就有一個函式 enumerateKeysAndObjectsUsingBlock,就可以一次繞完整個 NSDictionary 了,而這個函式在官方的定義如下:

- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(KeyType key, ObjectType obj, BOOL *stop))block;

看到這,或許你就會知道了,他是使用 Block 的方式做處理,而有三個參數,第一個參數 key 就是 NSDictionary 的 key,obj 就是 NSDictionary 的 Value,*stop 就是要不要停止的意思。

 

舉例來說,如果你一開始建了一個 NSMutableDictionary,如下:

NSMutableDictionary* m_mapRequestCache;
m_mapRequestCache = [[[NSMutableDictionary alloc] init] autorelease];
m_mapRequestCache["0"] = @(0);
m_mapRequestCache["1"] = @(1);
m_mapRequestCache["2"] = @(2);

Read More

XCode

如何改變 UISegmentedControl 被選中和未被選中時的背景色與文字顏色

XCode

 

UISegmentedControl 是 iOS 開發的一個重要元件,而我們常常利用他來做條件的選擇,如果用 XCode 中的 Interface Build 來拉出 UISegmentedControl 畫面的話,預設只有 Tint Color 和 Background Color 可以選擇,也就是當 UISegmentedControl 中的條件被選中時,就用 TintColor 來當文字顏色,用 Background Color 來當背景色; 若是 UISegmentedControl 中的條件未被選中,則用  TintColor 來當背景色,用  Background Color 來當文字顏色。這樣對於程式開發顯然不夠用,所以我們需要一點擴充。

 

UISegmentedControl-1

▲ 當用 XCode 內建的 Interface Build 來拉出 Xib 畫面時可以選擇的選項超少

 

Read More

如何在 Objectivie-C 中計算 MD5 雜湊值?

MD5 是一個相當常使用雜湊演算法,通常是用於驗證字串或是檔案是否正確。最近海芋在 iOS App 開發過程中,也有需要在 Objectivie-C 中計算 MD5 雜湊值,在 Objectivie-C 中,其實就有計算雜湊值的函式 CC_MD5,使用方式也很簡單,如果有需要這個函式的朋友,那麼就趕快來看海芋的使用吧!

 

首先,我們先來看一下 CC_MD5 的組成, CC_MD5 原始的函式如下:

extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)

 

Read More

如何讓 UITextField 輸入的文字為英文數字限定,而且自動轉換成大寫英文字母?

UITextField 是開發 XCode 用來開發程式的一個重要元件,也是讓使用者自由輸入文字的元件。UITextField 相對於 Android 系統來說,就是 EditText。而如果我們要設計一個欄位,如身份證字號,只能讓使用者自動輸入英文或數字,在 Android 來說,只要從 XML 中設定就可以了,但在XCode 中,我們則必須寫在程式碼中。寫法其實並不難,有分好幾種方式,而海芋個人是比較喜歡用正規表達式來限定,所以以下的方式,就以正規表達式來做一個示範。

 

假設,我們有一個 UITextField,已命名為 m_TextField_ID,如果要判斷讓使用者在該 UITextField 只能輸入英數的話,那麼只要寫以下的函式。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.m_TextField_ID)
    {
        NSString* resultString = [textField.text stringByReplacingCharactersInRange: range
                                                                         withString: string];
        NSString *regExPattern = @"[a-zA-Z0-9]*";
        BOOL bIsInputValid = [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", regExPattern] evaluateWithObject: resultString];
        return bIsInputValid;
    }
    return YES;
}

Read More

SVProgressHUD

[iOS開發] SVProgressHUD ~ 簡單易用的進度顯示器

最近海芋開始開發 iOS 程式,而在開發程式時,難免會遇到需要等待的程式碼,如下載進度,或者串接 Web Service 的服務,如果沒有一個等待的通知給使用者,會讓使用者有當機或者不好的使用經驗。「SVProgressHUD」則是一個進度顯示工具,有點像是 Android 的 Progress Bar,不同的是,SVProgressHUD 是以圓型進度工具顯示,相當符合 iOS 的設計風格,如果在找 Android Progress Bar 代替品的朋友,可以趕緊下載這個程式碼來開發您的 iOS 程式。

 

◎◎軟體小檔案◎◎
軟體名稱:SVProgressHUD
軟體版本:Release 14
軟體介面:英文
支援系統:iOS 開發
軟體下載:http://forum.jeasy.info/viewtopic.php?f=213&t=2071

 

在使用這個第三方套件前,我們先來看一下使用 SVProgressHUD 所呈現的效果,預設是六種效果。
SVProgressHUD
Read More

Category 是什麼?如何在 Objective-C 中使用 Category?

在 Java、C++ 等物件化的程式語言中,如果我們要擴充 Class,只需要使用「繼承」的寫法就可以了,在 Objective-C 中,當然也支援了繼承的概念,不過更特別的是他支援了「Category」這種繼承型態。什麼是「Category」呢?簡單來說,就是將現有物件的功能再加以擴充函式,讓現有物件更能符合自己想實做的方式。而使用 Category 只能針對既有元件再新增或者覆寫函式,並不能像繼承一樣新增成員變數。以下是 Category 的實做。

 

@interface 原Class名稱 (Category Name)
// function 宣告
@end

@implementation 原Class名稱 (Category Name)
// function 實做
@end

 

舉例來說,如果我要擴充 NSString 這個物件,在裡面新增一個的函式 showMySiteName 來顯示我的網站名稱,那麼我只要在 A.h 檔中這樣寫。

@interface NSString (NSStringCategory)
- (void) showMySiteName;

@end

 

接下來,我在 A.m 檔案做這個函式,就可以從外面存取了。

@implementation NSString (NSStringCategory)
- (void) showMySiteName{
    NSLog(@"海芋小站真的棒!!");
}
@end

 
Read More