私人通讯录思路

来源:互联网 发布:软件系统安全保密设计 编辑:程序博客网 时间:2024/06/02 08:00
没有帐号和密码就无需登录,要监听文本框,启动的时候默认不能点击登录按钮
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

0 0
原创粉丝点击