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