解決 OS X 與 Windows 時間不同步的問題:
在開始的搜尋欄或命令提示字元裡輸入 regedit 後按enter鍵
找到以下位置
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
新增一個 REG_DWORD,名稱是 RealTimeIsUniversal,值設為 1。
然後再重開機,透過網路校正時間,我是只保留 Windows 的網路自動校正。
解決 OS X 與 Windows 時間不同步的問題:
在開始的搜尋欄或命令提示字元裡輸入 regedit 後按enter鍵
找到以下位置
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
新增一個 REG_DWORD,名稱是 RealTimeIsUniversal,值設為 1。
然後再重開機,透過網路校正時間,我是只保留 Windows 的網路自動校正。
使用 Xcode 執行模擬器出現這個錯誤訊息。
ios simulator failed to install the application
奇怪的是之前都沒遇到,Xcode 5 則是遇到無數次了。
解決方式很簡單,重設你的 iOS 模擬器。
iOS Simulator → Reset Content and Settings... → Reset
在 iOS 6 或更早的版本我們可以藉由以下兩句跳到指定 App 的介紹頁面或是評價頁面。
// 跳到介紹頁 NSString *str = @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=546652347"; // 跳到評價頁 // NSString *str = @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=546652347"; [[UIApplication sharedApplication] openURL: [NSURL URLWithString:str]];
但在 iOS 7 這樣寫只會跳到空白的頁面,語法要改成這樣:
// 跳到介紹頁 NSString *str = @"itms-apps://itunes.apple.com/app/id546652347"; // 跳到評價頁 // NSString *str = @"https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=546652347&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8"; [[UIApplication sharedApplication] openURL: [NSURL URLWithString:str]];
並且不能直接跳到評價那個頁面了,這語法支援 iOS 5.1+,所以之後都用這種語法吧!
首先要取得低版本的 iOS SDK ,如果手邊有舊版 Xcode 4.x 就去底下的位址複製再貼到 Xcode 5 裡。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
該目下會有各版本的 SDK ,例如 iPhoneOS6.1.sdk 。
若手邊沒有也可以去 iOS Dev Center 下載舊版的 Xcode 。
下載後不用安裝,只需掛載拿取裡面的 iPhoneOS6.1.sdk ,位址跟上面的一樣。
接下來就是設定 Xcode 的部份了,Build Settings → Architectures → Base SDK 改成 iOS 6.1 。
這樣在 iOS 7 上跑也都是看到舊版的 UI ,但這也代表無法使用 iOS 7 帶來的新功能。
Line API 我不想看韓文及日文,終於讓我找到英文版的。
我測試之後發現它無法同時傳送文字及圖片,只能一次傳一種格式。
傳送文字時,若是網址會變成超連結。
NSString *plainString = @"Hello, World! 中文測試~"; NSString *contentKey = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)plainString, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8); NSString *contentType = @"text"; NSString *urlString = [NSString stringWithFormat:@"line://msg/%@/%@", contentType, contentKey]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
傳送圖片的圖片來源可以是網路、專案或是手機內的,只要是 UIImage 都行。
UIPasteboard *pasteboard = [UIPasteboard pasteboardWithUniqueName]; NSString *pasteboardName = pasteboard.name; NSURL *imageURL = [NSURL URLWithString:@"https://www.google.com.tw/images/srpr/logo4w.png"]; [pasteboard setData:UIImagePNGRepresentation([UIImage imageWithData:[NSData dataWithContentsOfURL:imageURL]]) forPasteboardType:@"public.png"]; NSString *contentType = @"image"; NSString *contentKey = (__bridge_transfer NSString*)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)pasteboardName, NULL, CFSTR(":/?=,!$&'()*+;[]@#"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); NSString *urlString = [NSString stringWithFormat:@"line://msg/%@/%@", contentType, contentKey]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
加上檢查有沒有安裝 Line 再執行以上動作會更好。
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"line://"]]) { // do something }
Snakes & Ladders !
這是一個源自印度的古老 經典桌上遊戲,英文是「Snakes and Ladders」,中文硬翻大概是 「蛇與樓梯」 或是 「蛇梯棋」。棋盤上每格都有1~N的連續數字(視棋盤大小而定),以骰子擲出的點數來決定前進步數,多名玩家以到達終點為目標進行遊戲,其中還有蛇與樓梯 會干擾或幫助玩家,踩到蛇頭會滑落至蛇尾,踩到樓梯便能爬上樓梯頂端,是一個沒有技巧純粹運氣的遊戲,而且玩家間也沒有互動,但是規則簡單又可訓練加減法 所以遊玩年齡都偏低,我也有看過變形規則之後用在教英文上面。
這部作品會誕生歸功於我參加了一個 App 開發養成班,而那個班要求每人必須要有作品才能畢業(不管是個人還是組隊),大約花了三個月總算搞出來啦。為了完成我的個人作業,我另外找了兩位大學同學 幫我畫圖(我好壞~),由於風格是手繪所以我拿到圖後還要掃描+去背才能跟電繪的格子及數字整合在一起。而且因為是 universal 版,兩種尺寸大小不一樣,有些元件沒辦法直接等比例縮小,必須調整版面來符合 iPhone 的螢幕。至於音效、音樂則是網路上找來的,由於是非商業使用所以還好。
為何主題是 「Snakes and Ladders 」呢?因為考慮到能力限制又不想做單純的工具類 App ,所以就把腦筋動到靜態的桌上遊戲啦,另一個原因是那個課程完全沒有教製作遊戲類 App 的相關知識。我起初把這遊戲想的太簡單了(遊玩規則真的很簡單),做的時候才發現問題一堆阿,數字單數行及雙數行前進的方向不一樣,解決方法是每格皆以座 標為中心移動,兩種尺寸就200個座標。另外一個大問題是程式比畫面顯示執行快多了,後來用了延遲讓程式碼停頓讓動畫播完之後才繼續執行。
這是我在 iOS 上第一款上架的作品,也是至今為止第一個「完整」的自製遊戲,當然意義不只這樣,這同時也是我應徵工作 demo 的作品。我相信因為不需要會寫程式而購買「RPG 製作大師」的人肯定不少,但真的運用這工具做出遊戲的人不多,大部分的原因都是越做越大,沒有加以限制,一直找腳本與素材,或是發現企劃的內容因技術不夠 做不出來而放棄。建議大家把眼光縮小,從簡單的開始做起,至少有了完整作品所帶來的成就感能成為你的學習動力。
將包有 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];
Property's synthesized getter follows Cocoa naming convention for returning 'owned' objects
出現這個錯誤訊息可能的原因
property 的名稱不能以 new 及 copy 開頭
這也是新手滿常見的問題, 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; }];
不知道有沒有這種經驗呢?
創建 Class 當時沒有認真想名稱,或是第一個字母忘記用大寫(某種強迫症),但是檔案又修改到一定程度了。
這時如果手動改會死人,檔案名稱就不講了,檔案內容裡也有眾多項目要改,用尋找與取代還是很慢而且容易出錯。
好在 Xcode 裡有 Refactor 這功能方便許多。
建議做之前請先備份整個專案。
例如我要將 introductionVC 改成 IntroductionVC (.h .m .xib共三個檔案)
打開 introductionVC.h 選取 @interface introductionVC : UIViewController 的 introductionVC 部分
Edit → Refactor → Rename → 輸入名稱 → Preview → 會有預覽畫面確認 → Save → 問你要不要做 snapshot → Enable
請注意:若修改前後只是差在大小寫,檔案名稱會無法修改,所以我執行同樣動作兩次才能達到目的。