你為什麼不該在你的 iOS 軟體專案中使用 Storyboard

Storyboard 是蘋果從 iOS 5 起在 Xcode 開發工具中增加的新功能。

一直以來,無論是 Mac OS X 或是 iOS,都可以將應用程式所需要的介面呈現放在 nib 或是 xib 檔案中。我們可以用介面設計工具 Interface Builder(Xcode 4 整合到 Xcode 中),使用視覺化方式編輯 nib 或 xib 檔案,在程式執行時讓 runtime 將檔案中的 UI 定義轉換成對應的 Objective-C 物件。

因為之前有人問我為什麼有些 UIView subclass 在建立時會呼叫 initWithCoder:,而不是 initWithFrame:,其實並不難懂,這邊簡單解釋一下:nib 檔案是將 Objective-C 物件 serialize 成 binary data 的格式,所以用 nib 建立 UI,其實可以想成就是把 serialize 過的 data 再轉回物件;Objective-C 中負責處理物件/serialized data 相互轉換的物件叫做 NSCoder,所以你定義在 nib 裡頭的 view 在被建立時,呼叫到的就是 initWithCoder: 了,這套物件與資料轉換的機制,同時也是 Mac OS X 與 iOS 上實作 copy/paste 的基礎。而 xib 檔則是用 XML 格式表示 nib 檔的內容,在現在的開發流程中,平時我們會編輯 xib 檔案,但 xib 檔案會在 compile time 時被編譯成 nib 檔。

Storyboard 是這種視覺化開發方式的進一步發展。

在 iOS 5 之前,如果應用程式中有許多畫面,負責每個畫面的是各自的 view controller,在每個 view controller 中除了可以用程式碼撰寫建立 UI 物件外(實作 loadView: 這個 method),另一種方式則是讓每個 view controller 有各自對應的 nib 或 xib 檔案;Storyboard 則是將應用程式中原本有多個 nib 或 xib 檔案,合併成一個巨大的 XML,不但可以一次看到所有的畫面設計,也可以看到每個畫面之間透過線條串連起來的關係。或許可以這麼說:Storyboard 除了是一套畫面的設計工具外,也是一套說明在時間中畫面如何變化的敘述工具。

不過,在你的軟體開發專案中,建議不要使用 Storyboard。

Continue reading

與其說語言影響思考,不如說不同語言中就該用不同的方法做事

前陣子被同事抓出來一段 code 有些問題。

我之前有一段 code,由於開始的時候對於整個程式的流程應該怎麼做不怎麼有把握,所以先用 Python 寫了 POC,覺得沒什麼問題之後,才用 Objective-C 重寫。裡頭有一段是這樣:我有兩個 array(當然,在 Python 裡頭用的是 list),叫做 a1 與 a2 好了,裡頭都是一堆字串,而我現在要把 a1 中拿掉所有出現在 a2 的內容;用 Python 想事情,自然就會想到使用 list comprehension 或是呼叫 filter()。

Continue reading

在 Mac OS X/iOS 上指定中文排序

前一陣子遇到一個需求:我們現在有一個 array,裡頭是一堆中文字串,現在我們想要讓這些中文字串按照一些個定的中文索引方式排序,像是使用筆劃、拼音…等等。搞了半天,發現只要在 compare 的時候,選擇特定的 NSLocale 就好了,但是蘋果自己的文件中,居然對於有這些 Locale 可以設沒什麼著墨,顯然很多時候光看蘋果的文件是不夠的。

我們先來看段使用筆畫排序的程式碼:

NSArray *a = @[
	@"落魄江湖載酒行",
	@"楚腰纖細掌中輕",
	@"十年一覺揚州夢",
	@"贏得青樓薄倖名"];
NSLocale *strokeSortingLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh@collation=stroke"];
a = [a sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
	return [obj1 compare:obj2 options:0 range:NSMakeRange(0, [obj1 length]) locale:strokeSortingLocale];
}];
for (NSString *s in a) {
	NSLog(@"%@", s);
}

Continue reading

有人問我什麼是 Scrum

Scrum 並不能夠幫助你寫出更好的程式碼,也不能夠保證你發想的軟體產品可以在市場上獲得成功,基本上在任何處理跟人有關的議題時,任何方法都不能夠保證可以收到什麼功效。而 Scrum 在軟體開發過程中可以提供的幫助是,如果你的團隊真的懂怎麼寫程式的話,起碼可以讓他們有多一些時間可以把程式寫出來。

如果要給 Scrum 這個字一個簡短的解釋,那就是「Stop Crazy, Restless but Unnecessary Meetings」,少開會沒事,沒事少開會。如果我們想要了解一把槌子,我們首先要了解的是這把槌子要拿來搥的是怎樣的釘子,如果我們想要了解一門方法,首要工作就是這門方法打算解決怎樣的問題。Scrum 所要解決的問題就是:在上班時間中,太多的會議造成工程師最後沒辦法把程式寫出來。

Continue reading

Mac OS X Lion 的 Sandbox 模式與輸入法

這篇文字想來對絕大多數人都沒什麼用處,不過就是自己留一篇筆記。

把工作機升級到 Mac OS X Lion 之後,在一些應用程式當中,例如系統內建的文字編輯工具(TextEdit.app)以及預覽程式(Preview)中,就遇到無法使用輸入法的問題—點選輸入法選單,我要用的輸入法選項就是灰色的,無法選用。說起來奇怪,應該不是輸入法程式本身有什麼問題,因為在其他應用程式中可以正常使用,而且之前在測試 Beta 版本的 Lion 時,也沒有遇到這個問題,用搜尋引擎找個一輪,也沒有看到其他人遇到這種狀況。

Continue reading