一. 通讯录项目(简单UI项目)--->用storyboard搭建
项目内容:
1. 导航控制器之间跳转
2. 导航控制器之间的数据传递
2.1 顺传
2.2 逆传
3. 代理;协议
4. 通知
总体功能图:
搭建界面:
1. storyboard搭建界面
控制器方面选择:
1> UINavigationController(导航控制器)
2> UITableViewController(显示界面一)
3> UIViewController(显示界面二)
4> UIViewController(显示界面三)
5> UIViewController(显示界面四)
2. 创建好文件夹
一. 控制界面一(登录界面)
1. 第一个页面业务逻辑(XFloginViewController)
1.1 只有账号和密码同时有值得时候,登录按钮才能点击
监听:addTag;代理(不行)--->这里我们用addTag进行监听文本框文字是否编辑了
代理:代理监听文本输入的文字行不通的原因是:当我们在监听的代码中打印输出账号的文本的值时候,我们可以看出开始点击的时候不能及时的打印结果,意思就是输入第一个数不能很快的响应,当输入第二个数的时候才把第一个数打印输出来,所以这里不能用代理监听的原因是不能及时改变文本的改变,
addTag监听:我们可以查到头文件文本是继承UIControl的,所以我们可以用这种方法进行监听
代码:
对登录按钮进行监听的结果代码:
1.2 开关业务逻辑处理(记住密码和自动登录)
a. 记住密码开关关闭时,自动登录开关关闭(有动画效果)
b. 自动登录开关开启时,记住密码开关开启(有动画效果)
代码部分:
1.3 模拟登录时候的页面提示(这里我们引用第三方框架MBProgressHUD)
代码:手动跳转
跳转原理:由于登录的时候我们用到的方法是手动跳转,那么要完成手动跳转就必须绑定Segue标识,等完成账户名和密码的确认的时候,如果账户和密码正确,那么系统是根据在storyboard中为Segue绑定的标识来跳转到相应的界面的,下面代码用到了performSegueWithIdentifier: sender: 这个对象方法来实现跳转的
下面是此方法的底层实现原理:
1.4 第一个界面中的账户名传入到第二个界面的头标题
方法: 顺传
顺传原理: 1.4.1 目标控制器定义属性用来接收传递的数据;
1.4.2 来源控制器拿到目标控制器;
1.4.3 把来源控制器的数据传递给目的控制器设置的属性.
代码部分:
二. 第二个页面-联系人界面
2. 第二个页面页面逻辑(UITableViewController)
2.1 show和push区别
在storyboard中拖线到控制器之间的联系的时候会出现show和push,这里我们选择push,虽然show也能完成逻辑功能,但是选用show的话,不能在头部上设置文字,但是push可以,所以,这里我们选择push
2.2 注销按钮业务逻辑(在ios8.3之前我们可以采用UIActionSheet来实现,但是ios8.3之后将UIActionSheet和UIAlertAction合并了,但是我们依然可以使用UIActionSheet来实现)
这里我们采用UIAlerController中的方法来实现,下面是代码部分:
三. 第三个界面-添加界面
3. 第三个页面业务逻辑(UIViewController)
3.1 点击添加按钮跳转到下一个页面(自动和手动跳转)---->自动(采用拖线的方式进行跳转)
3.2创建第三个控制器
3.2.1处理添加按钮业务逻辑(和第一个页面一样)----->用addTag的方法实现对添加按钮的监听,代码和第一个页面的相同
3.2.2点击添加按钮后将两个文本中的值传给第二个控制器,并在cell中显示内容
方法: 逆传和代理(我们用代理的方法,在开发的时候我们也都是用代理,因为逆传方法使得代码之间的关联性太强,依赖性太强,不 符合高内聚,低耦合的思想,并且也违背了封装的特性,所以我们这里就用代理的方法来实现添加的传值逻辑)
思想: 由于第三个控制器中的内容要传递给第二个控制器,那么由于每次传的值样式都是基本想同的,这里我们可以联想到用模型的方法,我们可以创建一个模型,然后将数据存储到模型当中,用模型来传递数据,这样大大的方便了传值
步骤:
1. 创建一个模型
2 .模型中的数据
代码块一:
代码块二:
3. 设置代理
3.1 由于第二个控制器是接收方,我们可以设第二个控制器为代理,并且在第三个控制器中设置一个协议,代理属性和协议方法,然后让第二个控制器成为代理,并且遵守协议,我们通过协议的方法将模型传递给第二个控制器
3.2 协议部分
代码块一: 协议方法
代码块二: 代理属性
3.3 添加按钮部分
代码块:
3.4 写在第二个控制器中的有关添加添加按钮的传值部分--->懒加载;数据源;设置代理;实现代理方法
懒加载代码:
注意: 由于拖线实现的页面跳转,那么在跳转的时候会实现prepareForSegue: sender:这个方法,所以我们在这个方法里面设置代理
设置代理代码块:
实现代理方法代码块:
tableView的数据源方法我这里就不写了,大家可以翻翻前面的博客,里面大致都是一样的.这样第三个控制器就把添加按钮的内容传递给了第二个控制器.
四. 第四个界面-编辑界面
4. 第四个页面业务逻辑(UIViewController)
思路: 通过用户点击第二个控制器中的某行cell然后跳转到编辑界面,我们可以知道完全可以通过创建好的模型来实现数据的传递,然后运用发布通知的方法实现数据的保存,其中我们可以把模型当做是桥梁,都是通过模型来实现数据的传递,保存
步骤:
4.1 创建第四个控制器管理业务逻辑
4.2 给控制器的子控件赋值,要在ViewDidLoad里面设置
代码块:
4.3 处理编辑按钮的业务逻辑--->编辑有两种状态:没点击的时候显示"编辑";点击过后变成"取消",然后根据不同的内容实现业务逻辑
代码块:
4.4 监听保存按钮逻辑
思路: 通过发送通知的方法和监听发送的通知来实现
先监听通知: 要知道监听通知永远是在发送通知之前就要监听的
代码块一:
代码块二: 将用户修改好的数据传递给模型,由模型来传值
代码块三: 在prepareForSegue: sender:方法中实现模型值得回传(修改好的的模型传值给模型)
五.分割线管理
1. 除去分割线(只需要在第二个控制器中的view加载完的时候调用就可以去除分割线了)
代码块:(通过创建一个空的UIView对象就可以达到效果)
六. 拖第四个控制器的时候可能会出的错
注意: 会出错如下图
原因是因为: 当点击第二个控制器中的cell的时候,由于一点击,就会调用prepareForSegue这个方法,但是由于下图中蓝色部分在目的控制器中并未设置,没有代理这个方法,所以就会报错.这里需要做if判断