通讯录项目(代理;通知;数据顺传;逆传)

一. 通讯录项目(简单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判断

五.总结

     希望通过这个例子大家能在里面学到些东西,或许有困扰你的地方,但是只要认真阅读我的博客,相信一定能为大家解答疑惑,有什么问题欢迎的家提问,谢谢!!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值