天天看點

私人通訊錄思路

沒有帳号和密碼就無需登入,要監聽文本框,啟動的時候預設不能點選登入按鈕

UITextField繼承UIController,addTarget監聽不了(沒有監聽輸入框狀态的狀态),它一般監聽按鈕點選,值的改變.是以利用UITextField代理,協定方法中也沒有監聽輸入狀态改變的

再試利用通知去監聽UITextField改變,[[NSNotificationCneter defaultCenter] addObserver:self selector:@selector(自定義方法) name: UITextFieldTextDidChangNotification object:nil(設定nil誰都可以監聽,一個頁面有N個輸入框的時候都會被觸發)是以這裡要設定成self,目前控制器下的輸入框才會被觸發];在觸發的方法中判斷帳号和密碼的length 是否為空,為空就設定按鈕enabled為NO,否則為YES

StoryBoard中輸入框屬性勾選secure,設定暗文提示.

自動登入的時候同時自動打開記住密碼,相反關閉記住密碼的時候也要取消自動登入。

監聽Switch狀态,利用Controller的addTarget方法監聽值的改變

Switch的屬性on可以判斷是否打開和關閉,判斷是否自動登入,是的話就打開記住密碼開關屬性,相反,沒有記住密碼的話自動登入就不能自動打開,開關的動畫方法setON:  andmated:

監聽登出按鈕點選彈出底部提示

[[UIActionSheet alloc] initWithTitle: delegate: cancelButtonTitle: destructiveButtonTitle: [紅色提示文字]otherButtonTitle:,nil];

[sheet showInView:self.view] 顯示控件

點選确定後回到登入界面,移除棧頂控制器

sheet代理後,actionSheet: clickedButtonAtIndex:

判斷索引為0的按鈕被點選就移除棧頂控制器,傳回界面

監聽登入按鈕,判斷密碼真假

Segue 跳轉的連線

3個屬性,唯一辨別 identifier 來源控制器 sourceViewController 目标控制器 destinationViewController 分為2大類:自動 點選按鈕自動跳轉,不做任何判斷(控件到控制器)    手動       通過代碼手動,需要判斷處理(從控制器拖到控制器)必須設定identifier    [self performSegueWithIndentifier: sender:];

第三方架構:MBProgressHUD

成功登入過程中,顯示蒙版(擋住不讓使用者繼續操作直到跳轉)

資料傳遞

順傳 登入->聯系人清單

跳轉之前調用,設定下一個控制器資料

  • (void)prepareForSegue: sender:

這裡面可以取出來源和目标控制器,目标控制器強轉才能擷取屬性

逆傳 添加頁面->聯系人清單

控制器銷毀的時候必須在dealloc中移除監聽

removeIbserver:

點選添加後,移除棧頂控制器,給聯系人傳遞資料

添加頁面擁有清單屬性然後屬性調用自定義的方法

在聯系人跳轉到添加頁面之前調用prepareForSegue: sender:

擷取目标控制器,然後指派給下個頁面的目前聲明的屬性

這個方法耦合性太強,不推薦

當A控制器想監聽B控制器的變化,當B想通知A的時候,就用代理

通知代理之前記得respondsToSelector:檢測有沒此方法,提高程式健壯性

把屬性封裝成對象友善以後增加郵件,位址等需求,不用修改代理方法

手動調用鍵盤

becomFirstResponder但是這樣鍵盤出現的時間比界面早,是以要把這個方法寫在viewDidAppear

單擊cell進入編輯界面

跳轉之前要判斷是否跳到添加頁面,是的話再設定代理

isKindOfClass:

在編輯界面拿到之前聯系人的模型資料

擷取tableView點選的那一行 self.tableView.indexPathForSelectedRow傳回NSIndexPath

點選編輯按鈕後的事件:

讓文本框可輸入,儲存按鈕,電話輸入框成為第一響應者

點選之後判斷是編輯狀态還是取消

儲存按鈕

移除棧頂

通知代理傳輸資料

重新整理表格

自定義分割線

有聯系人才有分割線

self.tableView.separatorStyle分隔符樣式

系統的屬性無法瞞住需自定義

自定義cell,每一行手動添加分割線

awakeFromNib通過xib或storyBoard都會調用此方法

在這裡設定橫線 添加到contentView上

awakeFromNib這裡面不能擷取frame,永遠都是44cell高度,要在layoutSubviews裡修改

資料持久化

XML(plist)

Preference (偏好設定 plist)

NSKeyedArchiver(NSCoding) 可以寫入自定義對象

SQLite3 (需要指定語句)

core Data (Apple 資料庫,對象資料庫,Apple已封裝的SQLite3)

應用沙盒目錄

其他應用不能讀取

/Documents  iTunes備份會自動備份此目錄 遊戲存檔

/Library/Caches 緩存,會被銷毀 大的資料,視訊的緩存等

/Library/Preference 設定資訊,不會被删除,也會被備份 記住密碼等

/tmp 随時會被删除 臨時資料,下載下傳的圖檔等

plist存儲資料 隻能存放系統自帶的類型 自定義類型的不行 NSArray  對象方法 writeToFile: atomically: NSHomeDicrection(); 傳回一個NSString路徑

stringByAppendingPathComponent自動添加/

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); //會自動尋找使用者檔案夾,以後路徑變化也自适應,此方法一個數組,再用lastObject傳回字元串

缺點:不能儲存自定義對象,拼接路徑太繁瑣

偏好設定-軟體配置(本質也是plist,封裝了)

NSUserDefaults 單例對象 預設就是Preferences檔案夾下

[NSUserDefaults standardUserDefaults];

setObject: forKey: 存儲

缺點:不是實時儲存,系統内部某一個時間段才會儲存,有可能退出還沒儲存

想要立刻儲存的話, synchronize

NSKeyedArchiver 擴充名可以自己修改

archiveRootObject: 第三種可以儲存自定義

把自定義對象歸檔,需要實作一個協定,NSCoding

encodeWithCode:

當把一個對象儲存到檔案中時候調用,這個方法告訴系統怎麼儲存自定義對象資料

[encoder encodeObject: forKey:] 對象和基本資料方法不同

資料會被加密

讀取-解檔:NSKeyedUnarchiver unarchiveObjectWithFile:傳回id

解檔的時候也會調用一個方法,initWithCode:

decodeObjectForKey:

第二天完善

歸檔補充:

encodeWithCoder 儲存子類時候會先在此類中,找不到就回去父類找,屬性指派需要注意,重寫此方法

讀取同上

子類中的方法需要再次調用父類中的方法,以確定屬性指派完整性

讀取的時候,[super initWithCoder:];

通訊錄資料持久化

跳轉之前需要儲存偏好設定,帳号,密碼,是否自動登入,是否記住密碼

在 ViewDidLoad 中讀取偏好資料,需要自動登入要手動執行登入按鈕事件

在代理方法中持久化模型資料

歸檔

讓模型實作 NSCoding 協定方法

儲存完畢後 在延遲加載中讀取資料,讀取的時候判斷歸檔是否為空

cell 的滑動删除

tableView: commitEditingStyle: forRowAtIndexPath:

删除的時候既要删除 cell 也要删除資料持久化

reloadData 會重新整理所有 cell 性能不好

使用 deleteRowsAtIndexPaths: withRowAnimation; 單獨删除一行

兩邊的删除條數需要同步,模型資料被移除一條,cell 也隻能删除一條

系統自帶控件修改中文,系統本身語言環境,控件本地化(項目Info設定裡适配)

StoryBoard 導航欄左右預設不能添加多個按鈕,代碼添加

取出某一邊按鈕,建立一個新的按鈕,添加數組,傳回給導航欄屬性

打開編輯模式 editing 修改成 YES

編輯模式下某一行顯示+号 tableView: editingStyleForRowAtIndexPath:傳回這一行的樣式,修改成添加 Insert

contentView 是 自定義cell 的總 view,cell 會操控contentView

 移動,壓縮等,要是控件沒有添加到 cell 上 子控件并不會改變

#end

繼續閱讀