Nelson 寫些 iOS 開發的東東

Posts match “ objective-c ” tag:

擁有 Placeholder 的 UITextView

| Comments

iOS 的 UITextField 有 placeholder 的功能,可是 UITextView 卻沒有,想當然爾,一定早就有人寫好現成的元件了。我本來是用 SAMTextView,可是在某些英文字型底下,它無法漂亮的呈現中文,送 pull request 給作者又石沈大海,最後不得已只好基於原有程式碼,自己來修改一套。

GitHub 網址在這裡:CHTTextView

如何直接回到 RootViewController

| Comments

UINavigationController 是在 iOS 開發當中大量使用到的一個元件,我們可以用 pushViewController:animated: 切換到下一層 view controller,也可以用 popViewControllerAnimated: 回到上一層,或是用 popToRootViewControllerAnimated: 回到最上層的 root view controller。不過這些動作都得透過某種方式來觸發,例如按下某顆按鈕然後就可以回到上一層。

舉例來說,我現在有三個 view controllers 在 UINavigationController 裡頭,分別是「商品頁」、「結帳頁」、「結果頁」,流程很簡單,就是讓使用者點選喜歡的商品之後,切換到結帳頁面,結帳成功之後會顯示結果,然後使用者點了左上角的「Back」就會回到商品頁(因為已經結帳成功了,不應該回到結帳頁)。

〔商品頁〕 +-->〔結帳頁〕+-->〔結果頁〕
  ^                          + 
  |                          |
  +--------------------------+ 

實用的 Objective-C 第三方元件

| Comments

開發 iOS APP 有一段時間了,期間也用了不少第三方元件,感謝有這些第三方元件,讓我提高了開發的速度與品質。趁著今天這個機會,把幾個很常用的元件記錄下來,給大家作個參考,如果你有在用什麼很棒的元件的話,也歡迎留言跟我分享:)

底下這些是我幾乎在每個 APP 都會用到的,可說是必備元件:

使用 Nimbus NIModel 的時機

| Comments

Nimbus 是個在 iOS 開發環境中,許多人使用的第三方元件,它是這麼描述自己的:

Nimbus is a toolkit for experienced iOS software designers. It provides well-documented, modular components that solve a number of common iOS software requirements.

它包含了許多元件,其中一個我最近很常用的是 NIModel,它可以讓使用者在使用 UITableView 的時候不那麼糾結。用了這一陣子之後,總結出一些心得跟大家分享。這裡不講程式碼,只分享心得,反正程式碼人人都會寫~


千萬不要為了懶惰而用 new

| Comments

我們公司的 APP 一開始是請外包團隊幫忙開發,後來才找正職工程師進去維護的。不得不說,那個外包團隊的 iOS APP 工程師素質真的不怎麼樣,程式碼裡頭用了許多應該避免的寫法,其中一個就是它們大量的使用 [XXXObject new]

[XXXObject new] 其實是一個語法糖,它實際上會幫你轉成 [[XXXObject alloc] init],那這樣會有什麼問題呢?問題在於,我們在 init 時通常都需要傳入一些參數,而且很多時候該物件的 designated initializer 並不是 init。舉例來說,UITableViewControllerinitWithStyle:(UITableViewStyle)styleUIViewinitWithFrame:(CGRect)frame

所以偷懶用 new 的話,很有可能產生出來的物件會跟你預期的不一樣。我們的 APP 在 iOS 8 底下整個畫面爛掉,就是因為這個原因。

正確的 encode URL

| Comments

有的時候,我們需要將 URL encode,在 iOS 底下有這個函式可以使用

- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding

可是這個函式 有個 bug,所以若是它不能符合你的需求,那就得自己處理啦。

如果你有使用 Nimbus 的話,在 NSString+NimbusCore.h 裡頭有個 - (NSString *)stringByAddingPercentEscapesForURLParameter 可以幫忙正確將 URL 做 UTF8 Encoding。如果你沒有用 Nimbus,那就只好自己寫一個啦,底下的程式碼是從 NSString+NimbusCore.m 複製過來的。

/**
 * Returns a string that has been escaped for use as a URL parameter.
 */
- (NSString *)stringByAddingPercentEscapesForURLParameter {
  
  CFStringRef buffer = 
  CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                          (__bridge CFStringRef)self,
                                          NULL,
                                          (__bridge CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                          kCFStringEncodingUTF8);
  
  NSString *result = [NSString stringWithString:(__bridge NSString *)buffer];
  
  CFRelease(buffer);
  
  return result;
}

用 Objective-C 實作 Redux 架構

| Comments

前言

有一定的程式設計經驗之後,會愈來愈感受到程式架構的重要性,在 iOS app 開發的世界裡,最常見的莫過於 MVC 架構,因為它夠簡單而且是蘋果推薦的架構。但當你的程式越來越龐大,流程越來越複雜的時候,就會發現 MVC 架構已經無法滿足需求了。這幾年最為人所知的就是 MVP / MVVM / VIPER / Coordinator 這幾個模式。

我認為這些模式的著眼點都在於「UI」:它們假設你有一套辦法去存取或修改資料,然後它們提出的方案是關於如何處理「界面顯示 / 使用者互動 / 資料存取」之間的關係。

當程式越長越大,要儲存的狀態越來越多,不同畫面之間需要同步的資料也越來越多,我們該如何管理資料的存取、確保其一致性與正確性呢?Facebook 之前提出了 Flux 架構,後來有人提出改良版的 Redux 架構,不管是 Flux 還是 Redux,其重點都是在於「資料的流動是單向的,資料只有一份,並且只有一個角色可以修改資料」。

Flux / Redux 一開始提出是給網站使用的架構,後來有人把它套用到 iOS 開發,不過我查到的資料都是使用 Swift 實作。無可否認使用 Swift 來實作這套架構的確比較方便,只是我很好奇用 Objective-C 的話會有多困難,以下就是我的一些開發過程。