分類彙整: 程式

nsarray 轉 nsdictionary

將包有 dictionary 的 nsarray 轉成 dictionary , key 為高亮的那一行。

- (NSMutableDictionary *)indexKeyedDictionaryFromArray:(NSArray *)array
{
    id objectInstance;
    
    NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];
    for (objectInstance in array) {
        
        [mutableDictionary setObject:objectInstance forKey:[NSString stringWithFormat:@"%@", [objectInstance objectForKey:@"name"]]];

    }
    return (NSMutableDictionary *)mutableDictionary;
}

使用範例

    NSArray *array = [NSArray arrayWithObjects:
                      [NSDictionary dictionaryWithObjectsAndKeys:@"mark", @"name", @"100", @"score", nil],
                      [NSDictionary dictionaryWithObjectsAndKeys:@"tom", @"name", @"78", @"score", nil],
                      [NSDictionary dictionaryWithObjectsAndKeys:@"mary", @"name", @"81", @"score", nil],
                      [NSDictionary dictionaryWithObjectsAndKeys:@"sandy", @"name", @"65", @"score", nil],
                      [NSDictionary dictionaryWithObjectsAndKeys:@"sam", @"name", @"98", @"score", nil],
                      nil];
    
    NSDictionary *dictionary = [self indexKeyedDictionaryFromArray:array];

依照 nsdictionary 中的值來排序

這也是新手滿常見的問題, nsdictionary 裡有 name 跟 score 的值,產生一個由低分到高分的 keys 陣列。
這個方法可以自訂一些條件,nsmutabledictionary也同樣適用喔。

NSMutableDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                          
                          [NSDictionary dictionaryWithObjectsAndKeys:@"mark", @"name", @"100", @"score", nil], @"mark",
                          [NSDictionary dictionaryWithObjectsAndKeys:@"tom", @"name", @"78", @"score", nil], @"tom",
                          [NSDictionary dictionaryWithObjectsAndKeys:@"mary", @"name", @"81", @"score", nil], @"mary",
                          [NSDictionary dictionaryWithObjectsAndKeys:@"sandy", @"name", @"65", @"score", nil], @"sandy",
                          [NSDictionary dictionaryWithObjectsAndKeys:@"sam", @"name", @"98", @"score", nil], @"sam",
                          
                          nil];

NSArray *blockSortedKeys = [dict keysSortedByValueUsingComparator: ^(id obj1, id obj2) {
        
        if ([[obj1 objectForKey:@"score"] intValue] > [[obj2 objectForKey:@"score"] intValue]) {
            
            return (NSComparisonResult)NSOrderedDescending;
        }
        
        if ([[obj1 objectForKey:@"score"] intValue] < [[obj2 objectForKey:@"score"] intValue]) {
            
            return (NSComparisonResult)NSOrderedAscending;
        }
        
        return (NSComparisonResult)NSOrderedSame;

    }];

使用 Xcode 中的 Refactor 更改 Class 名稱

不知道有沒有這種經驗呢?
創建 Class 當時沒有認真想名稱,或是第一個字母忘記用大寫(某種強迫症),但是檔案又修改到一定程度了。
這時如果手動改會死人,檔案名稱就不講了,檔案內容裡也有眾多項目要改,用尋找與取代還是很慢而且容易出錯。
好在 Xcode 裡有 Refactor 這功能方便許多。

建議做之前請先備份整個專案。

例如我要將 introductionVC 改成 IntroductionVC (.h .m .xib共三個檔案)

打開 introductionVC.h 選取 @interface introductionVC : UIViewController 的 introductionVC 部分
Edit → Refactor → Rename → 輸入名稱 → Preview → 會有預覽畫面確認 → Save → 問你要不要做 snapshot → Enable

請注意:若修改前後只是差在大小寫,檔案名稱會無法修改,所以我執行同樣動作兩次才能達到目的。

使用 Application Loader 上傳至 iTunes Connect

不知從什麼時候開始,我用 Xcode 上傳放了一整天一直無回應(進度條一直沒變化),只好使用 Application Loader 上傳。

Xcode → Product → Archive → 跑完之後會自動開啟 Organizer 的 Archives 分頁。

這時滑鼠右鍵該項目 → Show in Finder → 對 .xcarchive 這個檔案 → 顯示套件內容 → 把在 Products/Applications/ 目錄下的 xxx.app 壓縮 → 把壓縮檔移至桌面(方便上傳而已)

呼叫 Spotlight(上方工具列的放大鏡) → 搜尋 Application Loader 並執行。
接下來的步驟就不用我說了吧! 上傳時間大約等個30分鐘再回來看看~

Xcode 超級基礎常見問題

  1. 部分檔案禁用ARC
    選取專案的Target → Build Phases → Compile Sources → 把要禁用檔案選取按enter鍵填入

    -fno-objc-arc
  2. 加入ASIHTTPRequest出現libxml/HTMLparser.h file not found錯誤
    選取專案的Target → Build Phases → Search Paths → Header Search Paths 填入

    ${SDK_DIR}/usr/include/libxml2

mysql 尋找與取代某個欄位的資料

這些半形字元會影響到解析,所以用了以下方法。

UPDATE TWEVTCAL_ACTIVITY SET content=REPLACE(content, '"', '”');
UPDATE TWEVTCAL_ACTIVITY SET content=REPLACE(content, '&', '&');
UPDATE TWEVTCAL_ACTIVITY SET content=REPLACE(content, "'", "’");
UPDATE TWEVTCAL_ACTIVITY SET content=REPLACE(content, '<', '<');
UPDATE TWEVTCAL_ACTIVITY SET content=REPLACE(content, '>', '>');