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 - 私人通讯录的主要内容,如果未能解决你的问题,请参考以下文章

IOS之--UI进阶-- 多控制器管理第一天

iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表

Python入门教程第61篇 函数进阶之偏函数

iOS开发UI篇—Quartz2D使用(图形上下文栈)

vue 进阶篇 Element Plus 基本使用

iOS开发UI篇--一个可扩展性极强的树形控件