给大家演示 应用程序下载 小项目,效果图:涉及知识点:懒加载,九宫格算法,字典转模型,自定义UIView ,xib文件的使用

首先把素材拖到Xcode项目中:简单看一下素材文件

此时大家应该首先关注.plist后缀的文件,里面存放的是我们用的数据,接下来看一下plist文件里面的数据

从这里面可以看到有12个应用程序下载,也就是12个UIView控件,

接下来,我们就加载这个plist文件,使用里面的数据.首先不是把plist文件拖拽到Xcode中就会自动使用的,而是加载plist文件,才能使用里面的数据

因为plist文件根节点是一个NSArray类型的,所以我们创建一个数组属性,保存plist文件中的数据

数组属性创建完成,那么就加载plist文件。也就是把plist和apps联系到一起,也就是加载数据

那么什么时候需要加载数据呢?这个时候就涉及到了(懒加载)知识点

懒加载:什么时候需要数据,什么时候去加载,如果不需要数据,我就不加载数据;看起来比较懒的做法,所以叫懒加载,怎么实现懒加载呢?

分析:只要知道什么时候需要使用数据,那么我就知道了什么时候去加载数据了。 我们在使用数据的时候一般都是通过点语法(getter方法)例如self.apps

这就是调用getter方法,获取到apps数组里面的数据。程序中,我们肯定有很多地方会用到self.apps,第一次使用self.apps点语法的时候,我们需要去加载plist文件,当第二次使用self.apps的时候,此时apps里面已经有plist文件中的数据了,我们就没有必要再去重新加载了,虽然说加载了也不会出问题,但是会影响程序的性能。如果这样分析,我们是不是可以在getter方法中做点什么,如果有数据就不加载了,没数据的时候,我们就去加载呢?懒加载的实现:

这个时候apps数组中存储的是12个字典,但是字典在以后的使用中有很多问题和不方便书写的地方,那么我们就涉及到了字典转模型

把apps中的字典转换成模型  模型是什么呢?模型就是继承NSObject的一个类,这个类中的成员属性,保存字典中的数据

所以字典转模型以后,apps里面存储的就是模型对象,不是字典了

字典转模型的重点就是:把字典中键值对存储的信息 转换成 模型对象的成员属性的值

首先创建一个类,这个类没有什么特殊要求,只要继承NSObject就行了

这个类要有成员属性,成员属性是根据字典中的键值对设置的:一个键值对就对应类中的一个成员属性,所以这个类有两个成员属性。确定一个属性:类型, 属性名称; 类型的确定:类型取决于键值对中的Value的类型, 属性名取决于key值。

AppsModel模型类已经创建好了,只要把字典中的数据赋值给模型中的成员属性就可以了,然后把模型对象添加到数组中,传给_apps,此时apps数组中存储的就是模型对象了,也就是所谓的字典转模型.在懒加载中实现字典转模型

模型代码优化:

接下来,我们在模型类中实现快速创建对象方法,首先在AppsModel.h文件中声明方法

在AppsModel.m文件中实现方法

此时,懒加载中字典转模型可以这样写:

好了,到目前为止,我们的self.apps数组中存储的模型数据。数据加载 工作完成了,下面我们就来搭建界面

分析效果图:

界面上有12个应用程序下载图标,12数字是怎么来的呢?是数组self.apps的长度。也就是self.apps里面存储了几个模型。归根结底是从plist文件中获取的

再分析:12个应用程序下载图标的大小都是一样的,格式也是一样的,就是每个应用程序下载图标(uiview)都是由图片(imageView),名字(lable),下载按钮(button)组成的,除了图片和名字显示的数据不一样,别的都一样。 此时介绍九宫格算法,先搭建12个小的UIView显示在界面上.

九宫格算法的本质就是for循环,因为每个人设置的数据都是不一样,我就以我的为例子,主要掌握的就是知道每个控件的x,y值是怎么计算来的,x值要用到i%3,y值要用到i/3,大家懂得这个就可以了

做到这一步,我们已经有了大概的轮廓了,这个时候只要给每个红色的UIView添加控件就可以了。刚才分析,每个小的UIView里面有3个控件,这个时候添加的时候,我们需要用代码设置frame,每个控件的属性,很麻烦,代码很繁琐。

下面介绍xib文件的创建和使用,xib是干什么用的,xib是用来描述部分屏幕的界面的,而storyBoard是用来描述整个屏幕界面的

为什么要提出xib呢,假如,我们用xib描述每个小的UIView,然后我们把xib描述的UIView直接整体加载到self.view中,很简单很方便。这个时候也不需要设置每个UIView的子控件的frame了,属性在属性区直接设置了,很简单,很方便

介绍:xib文件的创建

此时xib文件创建完成了,已经存在xib文件了;打开xib文件,

我们可以向这里面添加任何控件:

那么,我们接下来要给控件赋值,把self.apps里面的数据赋值给对应的控件

要给控件赋值,那么就先要拿到控件,怎么拿到控件呢? 前面我们说,xib文件和storyBoard很像,我们看看storyBoard是怎么做的,

我们一般都是用拖线的方式取到控件,在ViewController.m中取到控件。那么storyBoard是怎么和ViewController联系起来的呢,拖线必须满足一定的条件才能拖,不然是不能拖的。那么storyBoard和ViewController满足了什么条件呢?下面看一下ViewController,

其实ViewController只是一个类,只不过继承自UIViewController。为什么要继承UIViewController呢?我们看一下storyBoard

ViewController是最外层的,其余的都是它的子控件。Xcode自己设置了一个ViewController类,这个类继承UIViewController,然后通过把ViewController设置为ViewController的真正的类。就把故storyBoard和ViewController类联系起来了。那么我们模仿storyBoard ,设置xib

刚才我们说了,xib最外层是UIView,所以这个时候我们创建一个类,只要这个类继承UIView,就可以了

然后修改一下UIView的真实类型:

此时AppsView就是UIView的真实的类。

这个时候我们就可以拖线了

好了,我们已经拿到控件在AppsView.m文件中,此时数据在self.apps里面,self.apps数组里面存储的模型对象,所以我们给AppsView设置一个模型属性

为什么我们要设置这个属性呢?apps是ViewController类中的属性,那么我在AppsView类中拿到别的类的属性呢?这个时候,我们可以把ViewController类中

apps属性作为参数传递到AppsView类中,然后我在AppsView类中设置一个属性接收它。这个时候我在AppsView类中设置的属性类型是要和接收的数据的类型是一样的,所以我们要设置一个AppsModel类型的对象。

现在,AppsView类中有了一个AppsModel类型的 app成员属性,

这个时候,我们在AppsView类中就可以获得到数据了,那么我们最初的目的是给控件添加数据,并不是为app属性添加数据,那么接下来要坐什么呢?

分析: appsView.app = self.apps[i] 这行代码,点语法这个时候是setter,也就是[appsView setApp:self.apps[i]],这个时候调用的是属性app的setter方法

现在我写这句代码最终的目的是给控件添加数据,控件对应的成员属性为

我们最终是给imageView 和 nameLable赋值, appsView.app = self.apps[i] 这句代码调用app的setter方法,我们可以在setter方法中给这些控件属性赋值

就是重写setter方法:

setter方法重写结束以后,我们再分析 appsView.app = self.apps[i] 这个时候 self.apps[i]就相当于参数,把数据传递给控件属性。

运行程序,看结果

程序结束!

iOS开发系列-九宫格算法-xib的更多相关文章

  1. iOS开发基础-九宫格坐标(3)之Xib

    延续iOS开发基础-九宫格坐标(2)的内容,对其进行部分修改. 本部分采用 Xib 文件来创建用于显示图片的 UIView 对象. 一.简单介绍  Xib 和 storyboard 的比较: 1) X ...

  2. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  3. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

  4. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

  5. IOS开发系列 --- 核心动画

    原始地址:http://www.cnblogs.com/kenshincui/p/3972100.html 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...

  6. iOS开发系列

    因为最近面试了一些人,校招.初中级.高级.架构师,各种级别的,发现大家水平差异很大,有的高级的工程师很多问题都回答不上来,所以想梳理下iOS的知识点,写成一个系列,如果时间允许的话,会录制成视频放到网 ...

  7. iOS开发基础-九宫格坐标(5)

    继续在iOS开发基础-九宫格坐标(4)的基础上进行优化. 一.改进思路 1)iOS开发基础-九宫格坐标(4)中 viewDidLoad 方法中的第21.22行对控件属性的设置能否拿到视图类 WJQAp ...

  8. iOS开发基础-九宫格坐标(4)

    对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联. ...

  9. iOS开发系列--让你的应用“动”起来【转载】

    概览 原文链接:http://www.cnblogs.com/kenshincui/p/3972100.html 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...

随机推荐

  1. [原]使用MachOView辅助破解AppStore应用

    在破解iOS应用的过程中,需要经常使用 otool 开获取程序本身的信息(比如:是否启用了PIE),获取加密信息, 但是CLI的程序在直观性上还是不如GUI的, 下面描述使用MachOView来查看到 ...

  2. 在html中使用javascript显示本地图片的

    <html> <head> <script type="text/javascript"> function getFullPath(obj){ ...

  3. SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)

    SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析) 2013-8-20 1.    SQL查询表的行列转换/小计/统计(with  rollup,with ...

  4. go语言中的数组切片:特立独行的可变数组

    go语言中的数组切片:特立独行的可变数组 初看go语言中的slice,觉得是可变数组的一种很不错的实现,直接在语言语法的层面支持,操作方面比起java中的ArrayList方便了许多.但是在使用了一段 ...

  5. Opengl坐标转换

    有时候我们需要手动计算三维点对应的二维坐标,下面的矩阵公式就是模拟了一遍三维图形的流程.这里已假设读者具备了图形学的基础知识,比如矩阵乘法代表的三维变换,放射变换:还有齐次坐标等. 这里不考虑模型自身 ...

  6. CDM业务单据,表体单价列赋值所需要注意的问题

    需要将销售退回入库单据的单价自动去商品资料里的零售价值. 写了检索方案,然后 select * .............    spkfk.lshj as dj.........  ,但是发现定价依 ...

  7. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  8. Windows应用商店API

    Windows应用商店API 动手实验 实验 8: Windows应用商店API 2012年9月 简介 编写Windows应用商店应用最令人瞩目的理由之一是您可以方便地将它们发布到Windows应用商 ...

  9. Android 短信模块分析(二) MMS中四大组件核心功能详解

    接下来的分析先从MMS中四大组件(Activity ,BroadCastReceiver,Service,ContentProvider),也是MMS中最核心的部分入手: 一. Activity  1 ...

  10. How to install Savanna

    Pre-conditions: openstack has been installed successfully. 解压软件包中的savanna-all.tar.gz安装tar -C / -xzf ...