[iOS筆記]Core Data Model Version

iOS/Mac 的 Core Data 入門有一點點門檻,不過熟悉之後真的對程式架構,效能(尤其超級多行的 table view)等等非常有幫助。廢話不多說,跟 DB 一樣,當需要做 schema 變更時最有可能發生慘劇。這個之後如果有心得再分享。這邊是看官方文件時再度發生一種老賈果然討厭第三方開發者的錯覺。你看看那精美的文件,文件本身是很精美啦,但是裡面講的是舊版 Xcode 的操作,用的是舊版的截圖,我…我在 Xcode 4.2 找不到個選項啊(翻桌)。馬上就搜尋到 stackoverflow的答案兼抱怨文

http://stackoverflow.com/a/5374485

照敘述做還是要花一點力氣才能找到,就拍個截圖做公益吧XD 看了就明白,不廢話。

[iOS筆記] AddressBook 的 recordID

之前用到 Address Book 的時候就有聽說,一旦使用 Mobile Me 同步過之後,聯絡人的 recordID 就有可能會重新洗牌。(想來那個“同步”的方法是毀滅和再生啊,囧)當時因為要做的功能並非需要常時間保持資料的正確性,取得資料後讓 app 記住需要的資料,姓名電話 email 等等,然後就當做 dead link了,對使用者並不會有太大的不便。但現在碰到需求是真的要讓 address book 的聯絡人加上各種額外的資訊,這下 dead link是不能滿足需求的。於是再度抱著希望搜尋,想說 iCloud 是新的,應該沒有這麼蠢吧。我說,就是這麼蠢! 最新的情報告訴我們,沒有任何可以保證不會被 sync 變動的 uuid 存在…落落長的英語抱怨文在此:

AddressBook record identifiers on Mac and iOS

用名字去反比對基本上是更蠢的做法,雖然我很討厭 app 去污染系統通訊錄,不過看來唯一解只有在通訊錄中增加客製化欄位一途了。(嘖,這種 app 我自己才不用咧,我討厭污染…)

[iOS筆記]部份檔案使用/不使用ARC

專案中常會引入 3rd party 的 library,有些 library 開始支援 ARC,有些則否。或是想重複使用自己的舊程式碼時,又沒空(或沒必要)全部換成 ARC。針對一部份檔案加入特殊編譯選項,可在專案名稱點入後的設定區,選Build Phases > Compile Sources 多選你要的檔案後 enter,鍵入相關字串即可。
1. 你的專案使用 ARC, 但希望部份檔案不使用,則使用 -fno-objc-arc。
2. 如果你的專案不使用 ARC, 但部份檔案使用,則用 -fobjc-arc。

其實情形根本沒有這麼簡單,例如使用 ARC 的專案,不管怎麼設,某些 library 根本編不起來!(例如越獄女神牌的 ABContactHelper)當然也可能是我比較遜咖搞不定啦。自己管記憶體久了,啓動ARC後要抓漏,不能直接塞 release 也還滿不安的 XD (沒記錯硬要塞的話要直接 call C 語法)。結果本來已經很開心的要用 ARC,最後還是暫時關掉下次再說…

[iOS筆記]customize naviagtion bar

iOS4 以前要設定 navigation bar 的背景圖,基本上得 override 內建元件。(其他還有各種招數,但總之其實都是非官方做法)。應該已經很多人發現那些 hack 到了 iOS5 就失效了。但這次官方不是要刁難我們,而是提供了新API給我們用,使用方法請見 stackoverflow:

Custom background image on UIToolbar in IOS5 SDK

[iOS筆記]用NSLocale取得正在使用中的語言

NSLocale 有好多 method,每個名稱都很微妙,最令人困擾的就是
[[NSLocale currentLocale] localeIdentifier]
明明設定用繁體中文介面,但這個 method 總是 return “en_US”。第一個想法就是,該不會模擬器不支援吧….!最後還是在 stackoverflow 找到解答:不管是上面這個 currenLocale,還是 autoupdatingCurrentLocal 給出的都不是偏好設定中的「語言」,而是下面的「地區格式」的結果。上面的語言設定是這樣拿的:

 [[NSLocale preferredLanguages] objectAtIndex:0]

這個 Array 會把你勾選的語言排到最前面的 index 0。猜的沒錯的話,當系統中找不到對應的語系檔時,就會用這個順序沿路找下去找到為止 (大概啦)。如果你的 app 想針對不同語言設定時做一些字串設定之外的變化可能就會用到上面的技巧了,以上程式碼無添加塑化劑請安心服用。

[iOS]Tab Bar + Navigation Bar + Table View

iOS 開發的初學者如我,新增 Xcode Project 的時候,看到預設模板中有 Tab Bar Application,也有 Navigation-based Application,心中一定很納悶。明明 iPhone 上面隨處可見我家門前有小河後面有山坡….呃,是下面有Tab,上面有導覽列,中間是表格這樣的設計,竟然沒有模板?!好吧,那自己拉可以吧!運氣不好的話,就會發現某些狀況下沒辦法拉出你想要的畫面。其實重點在於,Tab Bar 下面可以包含 Navigation Controller,但反之不然。也就是說,Tab Bar 比較大尾。所以當你看到三種元件出現的時候其實是一個大的 Tab Bar, 包含了許多頁面,其中一個頁面裡頭 有一個 Navigation Controller + Table View。(Navigation Controller 不一定要跟 Table View 在一起就是了)

下面是一個解說的相當清楚的影片,不過請不要第一天玩 Xcode 就看,至少要會基本的 hello world之類的才看得懂。

不想看影片的話,也有圖文並茂的教學,但細節比較講的沒那麼清楚,請自行服用。
How to embed a navigation controller inside a tab bar controller

[iOS筆記]The Application Life Cycle

Apple Dev 講 iOS app 生命週期的文章在此:

The Core Application Design

iOS 的 App Life Cycle 比 Android Activity Life Cycle 簡單一點。

iOS 4 之前不支援背景多工時超單純,application delegate function被呼叫的順序如下:

1. 點選 app icon 啓動 app時
application:didFinishLaunchingWithOptions:
applicationDidBecomeActive:

2. 按下 Home 鍵返回桌面時
applicationWillTerminate:

真是簡單到不行了。
iOS 4 支援背景之後,按下 Home 鍵並不會結束 app 而是放入背景,接著進入 suspended 狀態,先不論多工 app 如 voip 或 media player 之類的,ㄧ般的 app delegate function 的呼叫情形大致上是:

1.  點選 icon 啓動 app
application:didFinishLaunchingWithOptions:
applicationDidBecomeActive:

2. 按下 Home 鍵返回桌面時
applicationWillResignActive:
applicationDidEnterBackgroud:

3. 再由桌面按 icon 返回 app
applicationWillEnterForegroud:
applicationDidBecomeActive:

基本上如此循環。iOS 4 原則上不會呼叫 applicationWillTerminate,只有當 app 跑在背景(非 suspended) 又忽然被中止的時候才會 call。點兩下 Home 鍵把 suspended apps 清除的時候並不會呼叫這個 function。

[iOS筆記]There is no SDK error

當你從路邊撿到一包 iPhone Xcode project,比如 Apple Dev 網站的 sample code。馬上用Xcode打開後按下Build and Run 之後卻發現 Build Failed,錯誤訊息是 error: There is no SDK with the name or path ‘iphoneos3.0′ (或 iphoneos2.0或其他)。此時不必驚慌,請依以下步驟服用即可:
1. Xcode 主視窗左上角的 Groups & Files 處,在你的專案名稱上按右鍵(或相等指令)叫出選單,選 Get Info。
2. 上面的四個分頁請選到第二項 Build。
3. 如果沒意外由上數來第三項應該是 Base SDK,你會看到它的 value 現在是 iOS Device 3.0 (missing) 之類的。請改為你要使用的,例如 iOS Simulator 4.1。
4. 容易疏忽的地方:此時再次按 Build and Run 有可能出現新的錯誤,但有時不會有錯誤。不論如何,請檢查 Xcode 主視窗的 Toolbar 最左邊的 Overview,設定值多半是 Device,請改為 Simulator。(除非你真的是連在 Device 上開發沒錯,都已經接上 Device 在除錯了,應該是不會困在這個基本初階問題上吧…)

[2011. 3. 2 資訊補充]
如果上面的步驟試過了仍然還是 SDK Missing, 例如官網的 PhotoPicker 這包 Sample code, 請繼續下面步驟:
5. 選單的 Project 中選 Edit Active Target “YourTarget” (如 PhotoPicker), 可以看到很類似上面步驟中出現的畫面, 仍然去同樣的位置找 Base SDK, value應該是不對的,請改成你想要的。
目前 Xcode 4.2版已經多了一個選擇是 Latest iOS (Currently set to iOS xxx),沒猜錯的話,改成Latest之後這些 Project都一勞永逸了。