iOS开发 - 第02篇 - UI进阶 - 08 - 私人通讯录
Posted NSRyan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发 - 第02篇 - UI进阶 - 08 - 私人通讯录相关的知识,希望对你有一定的参考价值。
实现:私人通讯录
源代码下载地址: 点击打开链接
1、实现要求
1> 多个控制器之间的跳转
2> 控制器之间的数据传递
3> 数据存储
2、登录界面到联系人列表界面实现思路
2.1 登录界面搭建
1> 在Storyboard中添加导航控制器,设置根控制器,并设置导航条的title
2> 搭建登录界面
注1:设置UITextField占位符和清楚文字按钮
注2:设置密码UITextField的暗文
注3:记住密码UILabel和开关以及自动登录UILabel和开关分别放在一个UIView中,方便布局和管理
注4:登录按钮默认不允许用户交互
2.2 联系人界面搭建
1> 界面控制器为UITableViewController
2> 登录界面控制器的登录按钮,连线跳转到联系人控制器,并设置登录界面的导航条标题,左侧Item(注销),右侧(加号)
2.3 登录界面初步实现
注:在开发中,一个模块对应一个控制器
1> 添加自定义控制器HMLoginViewController,关联登录控制器
2> 处理登录界面逻辑,监听文本框内容改变
注:监听文本框内容的三种方式 --- 重要
1. UITExtField代理
注:当采用上述代理方法时,每次只能获取之前文本框的内容,不能获得输入后文本框的最后内容,即:当输入a,打印为空,再输入b,打印a,因此在本例中不能立即获取帐号文本框所有内容,不能使用该方法
2. NSNotificationCenter(较麻烦)
3. addTarget(简单) --- UITextField继承自UIControl,因此可以addTarget
3> 记住密码和自动登录的开关处理:取消记住密码,也必须取消自动登录;打开自动登录,也必须打开记住密码
4> 联系界面的注销按钮处理
注:在ios8以上,已取消UIActionSheet,改用UIAlertController
5> 登录按钮处理
注:由于之前直接在登录按钮上拖线跳转到联系人控制器,因此自动跳转,不能判断帐号和密码是否正确
2.4 Segue (用作控制器之间跳转) --- 重要
2.5 登录界面实现修改 --- 重要
1> 设置登录界面跳转到联系人界面为手动Segue
2> 登录响应中判断帐号和密码,在程序开始手动判断登录按钮是否能点击,直接条用textChange方法即可
注1:若采用UIAlertView,则弹出账户密码不正确以后需要手动取消,不利于用户体验
注2:第三方框架MBProgressHUD(提示框功能)
注3:添加GCD延时操作(模仿实际应用中的联网判断帐号密码是否正确)
注4:添加蒙版,在登录的时候,防止用户点击,使用MBProgressHUD
3、联系人列表界面到添加联系人界面实现思路
3.1 添加联系人界面搭建
1> 控制器跳转无需判断,直接自动Segue即可
2> 搭建界面
3.2 添加联系人界面实现
1> 自定义控制器HMAddViewController,关联
2> 添加属性成员,输入情况与登录界面类似
3> 监听添加按钮事件响应,跳转到联系人列表界面,初步测试
3.3 控制器之间传值 --- 重要
1> 顺传 --- 上一个控制器传递到下一个控制器 --- 利用Segue
1. performSegueWithIdentifier:实现原理
2. 设置联系人界面的title为登录界面帐号(顺传)
2> 逆传 ----下一个控制器传递到上一个控制器
如:将添加联系人界面的信息,传递到上一个控制器(联系人列表)显示
1. 方法一:下一个控制器添加一个属性,指向上一个控制器
a. 在添加联系人控制器中添加一个属性,指向联系人列表控制器,在点击添加按钮后,给联系人列表控制器赋值
b. 在前一步,联系人列表控制器跳转到添加联系人控制器的时候,拿到目标控制器(添加联系人控制器),给其属性(指向联系人列表控制器)赋值
注:上述实现回传的方法耦合性太高,联系人列表控制器和添加联系人控制器谁也不能离开谁,一旦一个控制器没有,另一个控制器也不能使用,不推荐使用。
2. 方法二:代理 --- 上一个控制器成为下一个控制器的代理
a. 自定义一个模型(姓名+电话),添加快速创建模型方法,在点击添加后创建模型
b. 自定义添加联系人控制器的代理
c. 在点击添加按钮后通知代理
d. 在联系人列表控制器中,准备跳转到添加联系人控制器(这一步可以获得目标控制器),设置添加联系人控制器的代理为self
e. 在联系人列表中添加可变数组,保存上述模型,并懒加载
f. 实现代理
g. 实现联系人列表控制器(继承自UITableViewController)的数据源方法
3.4 添加联系人界面自动跳出键盘
主要要在视图显示的时候出现,不要在视图加载完成(ViewDidLoad)
4、联系人列表界面点击联系人跳转到编辑界面
4.1 编辑界面搭建
1> 联系人列表Cell直接自动Segue到编辑界面
注1:此时还不能跳转,因为之前的Cell是在tableView的dataSource方法中手动创建,不是从Storyboard中创建,因此在Storyboard中拖线不能跳转,需要在Storyboard中设置Cell的标识!!!
注2:由于之前在联系人列表跳转到添加联系人的prepareForSegue方法中设置了代理,而且每次跳转都会调用该方法,此时直接点击Cell跳转的话会导致程序崩溃,因此需要在该方法中添加对Segue的判断,判断跳转到了哪个控制器!!!
注3:如果从Storyboard中加载Cell,则会自动从缓存池中加载,不需要再判断Cell是否存在,方框内的代码可不写!!!
4.2 编辑界面实现
1> 自定义编辑界面控制器,关联
2> 将联系人列表控制器Cell中的数据传递到编辑界面控制器(顺传)
3> 将模型中的数据显示到编辑界面中
注:由于prepareForSegue:方法是在跳转前调用,因此不能在编辑界面的模型setter方法中赋值,显示数据,此时编辑界面仍未显示,由于懒加载,控件也不会生成,数据不会显示在控件上,而应该在模编辑界面的viewDidLoad方法中显示数据。
3> 改变编辑界面UITextField的清除按钮显示为编辑时显示
4> 监听编辑按钮响应事件,主要需要同时监听两个UITextField的内容改变事件(同登录界面),判断保存按钮是否使能
5> 监听保存按钮响应事件,此时需要回传数据,更新联系人列表,使用代理
注:将编辑界面的代理设置为联系人列表,实现代理中直接reloadData即可,因为联系人列表的模型和编辑界面的模型指向同一块内存!!!
5、自定义Cell --- Cell分隔线处理
5.1 移除UITableView的分隔线
注:通过上述方法则全部移除分隔线,在实际使用中需要在Cell有内容的时候显示分隔线,没有内容的时候无分隔线。
5.2 自定义Cell
1> 自定义一个Cell
注:由于是从Storyboard中加载Cell,因此需要绑定Cell ID(之前已经绑定),关联Cell类
2> Cell中添加类方法和模型及其setter方法,在tableView中只需传递模型即可
3> 给Cell添加分隔线(UIView)
注:不能在awakeFromNib中给divide设置位置,原因:Cell的位置右tableView决定,而awakeFromNib则在加载Cell的时候就已经调用,应该在tableView布局好Cell位置的时候设置分隔线位置,即在layoutSubViews中设置位置!!!
以上是关于iOS开发 - 第02篇 - UI进阶 - 08 - 私人通讯录的主要内容,如果未能解决你的问题,请参考以下文章