一、这个九宫格案例做好之后的效果如图: 1.这个下载是可以点击的,当你点击之后,弹出一个框,过一会儿,框框自动消失,这里变成“已安装” 2.那么,我现在先问大家一句话:大家认为在这一个应用里面,它包含几个控件, 3个,哪3个:一个是图片框,一个是Label,一个是按钮, 为什么说下面这个也是一个按钮呢,它或许也是一个图片框呢, 对,它可以点击,就说明它不是一个图片框吧, 这个下载的按钮,可以点击,所以它就不是一个图片框了, 二、下面,就把这个应用实现一下 1.先把大致结构说一下: 整体这个案例,我们把它叫做应用管理,什么叫做“应用管理”, 我们就是要安装很多手机应用,这里可以看到很多手机应用,我们点击下载,就把它下载到手机上了, 应用管理的意思就是,这里有很多手机应用,我们这里可以看到很多图片和下载按钮,点击下载,就把它下载到手机上了, 但是我们现在没有学习网络知识,我们现在只是学习UI,换句话说,我们就是把这个界面做出来,做出这个效果来,就可以了, 它并没有真正的“下载”功能,因为我们压根儿就没有实现联网功能, 后面在网络、多线程的课程里面,大家就可以去学习怎么下载, 这是后面的知识,今天我们要做的,就是把它排列出来, 首先,我们先分析一下,在这个界面上,要显示这么多应用,这些数据来源在哪里呢, 2.这个应用的数据来源是一个plist文件, 这些数据,不是我们一个一个写死的,数据是活的, 这些数据,来源于一个叫做app.plist这么一个文件, 所以我们首先,第一步,要先把数据加载起来, 第二步,根据加载好的数据,在界面上,全部显示出来,全部动态的创建这些控件, 在界面上,是全部动态的创建这些控件, 也就是说,这些控件不是说打开storyboard,一个一个拖上来的, 是我们通过代码动态生成的, 动态生成的好处就是,你数据里面有多少个应用,只要一执行,它就会根据数据,动态的生成这些应用, 首先,给大家看一下,数据在哪里,就在我们的项目根目录下,有一个app.plist文件,数据就在这个plist文件中, 其实这个就是一个xml文件,里面就是一个一个的标签, 我们双击打开看一下这个plist文件,整体是一个NSArray数组, 里面的每一个元素,又是一个什么,里面的每一个元素,又是一个字典, 第一步,把这些数据加载到我们的NSArray集合里面, 要加载这些数据,我们怎么做: NSString *path = [[NSBundle mainBundle] pathForResource:@“”]; NSArray *array = [NSArray arrayWithContentsOfFile:path]; 新建一个xcode项目,我们后面是不是要向我们的项目里面,是不是新建一些类啊, 所以,首先,我们设置一下这些类的前缀, 在Class Prefix属性里面,设置前缀,例如来一个“CZ”, 我们首先来加载数据,那么这个加载数据的代码在哪里写: 因为,我们这个项目里配置的main interface:main 也就是main.storyboard, 也就意味着:当这个项目运行的时候,它会首先,启动这个main.storyboard, 它会启动这个控制器,我们给它调整一下大小:在size里面,给个iphone 4.7 inch, 当你要启动这个控制器的时候,是不是要创建一个控制器对象啊, 创建一个控制器对象,它是创建哪个类的对象呢, 我们之前说,控制器是一个UIViewContrller,是这么一个类型吧, 然后,我们选中View Controller Scene下面的黄色的View Controller之后,在右边的属性里面,有个Customer Class,下面有一个Class属性,这里是ViewController, 是我们自己写的一个VIewController,它继承自UIViewController, 所以这个类,也是一个控制器的类, 所以,当我们启动控制器的时候,创建的是这个ViewController的对象, 既然你是创建这个类的对象,所以说,加载那些数据,是不是都要在这个类里面写代码, 我们后面大多数代码,都是在这个控制器里面写的, 3.我们第一步,做我们这个九宫格,首先,加载数据, 加载数据,我们说,是不是首先要写一个属性,用来保存这个数据吧, #import “ViewContrller.h” @interface ViewController () //保存应用的数据,我们这里是一个数组的数据,strong, //用来保存所有应用的数据, @property(nonatomic,strong)NSArray *apps; @end @implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; } - (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; } @end 然后,我们说,加载这个数据,是在什么时候加载的,我们说是在重写这个apps属性的getter方法的时候,进行加载的, 这种加载数据的方式,我们就管他叫做什么,懒加载, //重写apps属性的getter方法,进行懒加载数据, //怎么重写apps属性的getter方法呢,就是写一个减号,apps,直接回车,这就是重写apps属性的getter方法, - (NSArray *)apps{ //在重写getter方法里面,我们首先要判断, if(_apps == nil){ //加载数据, //1.获取app.plist文件在手机上的完整路径, //2.根据路径加载数据 //要获取路径,我们首先要先把素材拷进来,拷到这个Supporting Files下面吧, //找到app.plist文件,把它拷到Supporting Files下面, //然后这些图片,也拷进来吧,我们也会用到的,注意,这个icons下面的每一张,是不是那个应用的图像, //然后还有两张绿色的背景图,是那个下载按钮的背景图, //因为它们都是图片文件,所以就拖到images.xcassets文件夹下面,这样的话,我们就有了这些图片素材了 //这些图片素材有了以后,紧接着,我们就开始加载数据了, //首先加载的是app.plist,把这个文件中的数据,加载到我们的NSArray里面, //1.第一步,获取这个plist文件在手机上的完整路径,怎么获取,记得吗 NSString *path = [[NSBundle mainBundle] pathForResource:@“app.plist” ofType:nil]; //这是什么意思,mainBundle是一个方法,是NSBundle的类方法,它的返回值,就是一个NSBundle,是这个应用在手机上安装之后的根目录, //然后再这个根目录下,pathForResource:@“”,搜索,搜索什么呢,搜索一个叫app.plist的这么一个文件,因为我已经把后缀名写在这里了,所以后面我可以传一个什么,nil吧,这样的话,就拿到了这个应用的根路径 //拿到根路径之后,下面就是要加载,怎么加载,