私人通讯录思路
来源:互联网 发布:软件系统安全保密设计 编辑:程序博客网 时间: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
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
成功登录过程中,显示蒙版(挡住不让用户继续操作直到跳转)
数据传递
顺传 登录->联系人列表
跳转之前调用,设置下一个控制器数据
第三方框架: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存储数据 只能存放系统自带的类型 自定义类型的不行
逆传 添加页面->联系人列表
控制器销毁的时候必须在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
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
- 私人通讯录思路
- 练习:私人通讯录(整理思路)
- 私人通讯录
- 私人通讯录
- iOS私人通讯录
- No4 私人通讯录
- 小结:私人通讯录
- 小结:私人通讯录知识点
- 私人通讯录Demo - iOS
- 私人通讯录功能详细实现
- UINavigationController实例之私人通讯录
- 自建项目分享-私人通讯录
- iOS开发 - 私人通讯录实例
- 【案列】私人通讯录01
- 私人通讯录中遇到的注意点
- ui进阶第三天,私人通讯录的创建(元宵节快乐)
- 【案列】私人通讯录02 - 数据存储和删除
- 练习:私人通讯录(界面和功能展示)
- java实现生产消费者问题
- spket安装与配置
- 网易云音乐(2)————加载失败的原因
- 局域网文件共享的几种方法
- 谈C程序员修养及大型项目源码阅读与学习
- 私人通讯录思路
- Ipone Terminal(转)
- 黑马程序员----IO流(1)
- UI标签库专题五:JEECG智能开发平台 Tabs(选项卡父标签)
- NuptOJ最小代价树——动态规划
- iOS 图形绘制
- zz 详解linux下安装opencv2.4.1(eclipse)
- 使用xcode调试代码的时候进入断点显示变量全是nil,我用NSLog输出那个变量却是有值的,这个是什么原因呢?
- HDU 3652 数位DP