应用管理的实现

  1 1、加载应用信息:
  2  1.1、直接在controller里进行懒加载:(get方法)
  3   1.1.1、先判断是否已经加载数据:if (array == nil)
  4      1.1.2、先找到plist文件的路径:NSString *path = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"plist"];
  5   1.1.3、然后从文件中读取数据:array = [NSArray arrayWithContentsOfFile:path];
  6   1.1.4、把读到的数据返回;return array;
  7 1.2、封装成模型:
  8 + (NSMutableArray *)showAppInfos{
  9     NSString *path = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"plist"];
 10     NSArray *array = [NSArray arrayWithContentsOfFile:path];
 11     NSMutableArray *tempArray = [NSMutableArray array];
 12     for (NSDictionary *dic in array) {
 13         AppInfos *appInfo = [AppInfos appInfosWithDic:dic];
 14         [tempArray addObject:appInfo];
 15     }
 16     return tempArray;
 17 }
 18 2、根据应用信息来创建界面应该显示的view;
 19 2.1、直接代码生成控件:(重点是计算九宫格坐标)
 20 // 动态生成9宫格的方块
 21     for (int i = 0; i < self.appInfos.count; i++) {
 22         //动态生成view
 23         UIView *subView = [[UIView alloc] init];
 24         [self.view addSubview:subView];
 25         //计算frame
 26         CGFloat subViewW = 100;
 27         CGFloat subViewH = 100;
 28 //        子view的横向间距  =  (父view的宽度- 3 * 子view的宽度) / 4
 29         CGFloat marginX = (self.view.frame.size.width - 3 * subViewW) / 4;
 30 //        子view的纵向间距 =  20
 31         CGFloat marginY = 20;
 32       
 33 //        当前子view的行号 = 当前遍历到得索引值 / 总列数
 34         int row = i / 3;
 35 //        当前子view的列号 = 当前遍历到得索引值 % 总列数
 36         int column = i % 3;
 37       
 38 //        子view横坐标的公式 =  子view的横向间距  +  列号 * (子view的横向间距+ 子view的宽度)
 39         CGFloat subViewX = marginX + column * (marginX + subViewW);
 40 //        子view纵坐标的公式 = 20 + 行号 * (子view的纵向间距+ 子view的高度)
 41         CGFloat subViewY = 30 + row * (marginY + subViewH);
 42         
 43         subView.frame = CGRectMake(subViewX, subViewY, subViewW, subViewH);
 44
 45 AppInfos *appInfos = self.array[index];
 46
 47  [self displaySubView:iconView andAppInfos:appInfos];
 48
 49 - (void)displaySubView:(UIView *)iconView andAppInfos:(AppInfos *)appInfos{
 50     CGFloat iconViewW = iconView.frame.size.width;
 51     //CGFloat iconViewH = iconView.frame.size.height;
 52    //添加图片子控件
 53     UIImageView *imageView = [[UIImageView alloc] init];
 54     [iconView addSubview:imageView];
 55     
 56     CGFloat imageViewW = 60;
 57     CGFloat imageViewH = 60;
 58     CGFloat imageViewX = (iconViewW - imageViewW) / 2;
 59     CGFloat imageViewY = 0;
 60     
 61     imageView.frame = CGRectMake(imageViewX, imageViewY, imageViewW, imageViewH);
 62     imageView.image = [UIImage imageNamed:appInfos.icon];
 63     
 64     UILabel *labelView = [[UILabel alloc] init];
 65     [iconView addSubview:labelView];
 66     labelView.textAlignment = NSTextAlignmentCenter;
 67     
 68     CGFloat labelViewW = iconViewW;
 69     CGFloat labelViewH = (iconViewW - imageViewH) / 2;
 70     CGFloat labelViewX = 0;
 71     CGFloat labelViewY = imageViewH;
 72     labelView.frame = CGRectMake(labelViewX, labelViewY, labelViewW, labelViewH);
 73     labelView.font = [UIFont systemFontOfSize:15];
 74     labelView.text = appInfos.name;
 75     
 76     UIButton *btnView = [[UIButton alloc] init];
 77     [iconView addSubview:btnView];
 78     [btnView setBackgroundImage:[UIImage imageNamed:@"buttongreen"] forState:UIControlStateNormal];
 79     [btnView setBackgroundImage:[UIImage imageNamed:@"buttongreen_highlighted"] forState:UIControlStateHighlighted];
 80     
 81     CGFloat btnViewW = imageViewW;
 82     CGFloat btnViewH = labelViewH;
 83     CGFloat btnViewX = imageViewX;
 84     CGFloat btnViewY = CGRectGetMaxY(labelView.frame);
 85     btnView.frame = CGRectMake(btnViewX, btnViewY, btnViewW, btnViewH);
 86     [btnView setTitle:@"下载" forState:UIControlStateNormal];
 87     
 88     [btnView addTarget:self action:@selector(downLoadClick:) forControlEvents:UIControlEventTouchUpInside];
 89 }
 90
 91 2.2、使用XIB自定义view:
 92           拉一个view控件,对该view的Simulated Metrics的size 选择为Freeform;
 93          接着拉UIImageView、UILabel、UIButton三个控件,并设置好坐标;
 94         把自定义的view的Custom  Class设置成继承自UIView的同名的类:即XIB名和类名一致;
 95        在同名类里定义一个应用信息的信息属性和一个返回自定义View的类方法:
 96 +(instancetype)appInfosView{
 97     AppInfosView *view = [[[NSBundle mainBundle] loadNibNamed:@"AppInfosView" owner:nil options:nil] lastObject];
 98     return view;
 99 }
100 定义应用信息的信息属性主要是重写它的get方法:(控制器就可以直接调用并显示数据)
101 -(void)setAppInfos:(AppInfos *)appInfos{
102     _appInfos = appInfos;
103     self.nameView.text = appInfos.name;
104     self.iconView.image = [UIImage imageNamed:appInfos.icon];
105 }
106 3、显示数据,并完成点击下载时的功能
107 - (IBAction)btnClick:(UIButton *)sender {
108     self.superview.UserInteractionEnabled = NO;
109     sender.enabled = NO;
110     UILabel *tipsLabelView = [[UILabel alloc] init];
111     [self.superview addSubview:tipsLabelView];
112     tipsLabelView.text = [NSString stringWithFormat:@"正在下载%@",self.appInfos.name];
113     tipsLabelView.textAlignment = NSTextAlignmentCenter;
114     CGFloat viewW = self.superview.frame.size.width / 2;
115     CGFloat viewH = 30;
116     CGFloat viewX = (self.superview.frame.size.width - viewW )/2;
117     CGFloat viewY = self.superview.frame.size.height / 2;
118     tipsLabelView.frame = CGRectMake(viewX, viewY, viewW, viewH);
119     tipsLabelView.backgroundColor = [UIColor grayColor];
120     
121     tipsLabelView.alpha = 0;
122     tipsLabelView.layer.cornerRadius = 5;
123     tipsLabelView.layer.masksToBounds = YES;
124     
125     [UIView animateWithDuration:2.0 animations:^{
126         tipsLabelView.alpha = 0.9;
127     } completion:^(BOOL finished) {
128         [UIView animateWithDuration:1.5 animations:^{
129             tipsLabelView.alpha = 0;
130         } completion:^(BOOL finished) {
131             self.superview.userInteractionEnabled = YES;
132         }];
133     }];
134 }
135 主要是实现动画效果。

学习到的一些东西:

九宫格坐标的计算:找规律,找公式。

每一列的X值都是一样的,X值由列数确定的;

每一行的Y值都是一样的,Y值由行数确定的

字典转模型:

使用字典的坏处:

1、手写字符串key,key容易写错;

2、key如果写错了,编译器不会有任何的警告和报错,会造成设错数据或者取错数据;

3、不面向对象;

4、字典类型转换数组类型会有可能出现未知错误。所以最好去使用模型。

使用模型对象的好处:

1、模型,其实就是数据模型,专业的来表示数据;

2、模型设置和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,可以提高编码效率。

字典转模型:其实就是把懒加载plist数据的过程封装成类的一个对象方法,不需要viewcontroller知道要去怎么做,怎么加载等等。模型类的名字和plist文件的名字最好一致,并且把plist文件里字典的key改成类的属性。

XIB:

XIB和storyboard:(storyboard是ios5以后才有的)

共同点:

1、都是用来描述软件界面的;

2、都是用Interface Builder工具来编辑;

3、都使用xml来存储对界面的描述。

区别:

1、XIB只描述一个界面的某一部分;在资源代码中:和storybord相比就少了场景和viewcontroller的内容。

2、storyboard描述的是整个软件的所有界面,可以有多个场景。

获取XIB文件时用loadNibName的原因:因为Xcode编译完项目后会生成NIb扩展名的文件。

XIB的封装,自定义view

自定义view(注意新建时要小心别创建错误)

1、定义一个UIView的继承类,类名和XIB文件名一致;

2、在自定义的View中创建与XIB自定义控件的连线;

3、自定义view的封装:

3.1)、快速创建自定义view的对象,使用类方法;

3.2)、添加模型属性;

3.3)、重写模型属性的setter方法,给自定义view内的控件赋值

4、在controller中加载自定义的view

时间: 2024-08-10 21:29:43

应用管理的实现的相关文章

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

(转)web会话管理方式

阅读目录 1. 基于server端session的管理 2. cookie-based的管理方式 3. token-based的管理方式 4. 安全问题 5. 总结 http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的,但是对于我们的应用来说,我们是靠用户来管理,而不是靠客户端.所以对我们的应用而言,它是需要有状态管理的,以便服务端能够准确的知道http请求是哪个用户发起的,从而判断他是否有权限继续这个请求.这

MongoDB 分片管理

在MongoDB(版本 3.2.9)中,分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集.分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量. 数据集被拆分成数据块(chunk),每个数据块包含多个doc,数

10.23 linux任务计划cron10.24chkconfig工具10.25 systemd管理服务10.26 unit介绍 10.27 target介绍

- 10.23 linux任务计划cron - 10.24 chkconfig工具 - 10.25 systemd管理服务 - 10.26 unit介绍 - 10.27 target介绍 - 扩展 1. anacron http://blog.csdn.net/strikers1982/article/details/4787226  2. xinetd服(默认机器没有安装这个服务,需要yum install xinetd安装) http://blog.sina.com.cn/s/blog_46

C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基于JSON数据格式的Web API接口,在我之前的几篇随笔中,对这方面都有一定的介绍,本篇继续这个主题,细致深入的阐述如何在接口和源码的基础上整合Web API.微信后台管理及前端微信小程序的应用方案. 1.基于Web API的微信开发框架 首先我们各个业务模块,都应该围绕着Web API进行展开,

Java企业微信开发_09_素材管理之下载微信临时素材到本地服务器

一.本节要点 1.获取临时素材接口 请求方式:GET(HTTPS) 请求地址:https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID 2.获取临时素材接口的返回结果 企业微信官方开发文档中说明的返回结果如下: 若你以为这就是返回结果,然后跟之前一样,先访问接口,从http连接的输入流中的获取回结果的文本内容,你会发现你接收到的结果是一堆乱码. 这是为何? 以图片为例,此处千

微信小程序管理后台介绍

微信小程序的管理后台,每次进入都需要扫码,还是特别不爽,现在微信小程序还没正式发布,很多人都还没看到管理后台,这里抢先发布出来 ------------------------------------------------------------ http://www.cnblogs.com/likwo/p/6057258.html 好推小程序统计:https://weixin.hotapp.cn关键指标分析推广效果,一行代码接入微信登录 ---------------------------

一个简单的主机管理模拟程序

最近写的一个小练习,主要是把前面学的东西整合一下.写了一个简单的主机管理界面,主要是练习以下知识点: Session和Cookie进行登录验证(装饰器) 数据库的基本操作 (单表,1对多,多对多) Form的简单使用实现验证 Bootstrap模板写个简单界面 自定义分页 信号,中间件,CSRF,模板语言,JavaScript,AJAX等等 界面比较low,毕竟不是专业的. 附件里面是Django的源代码,3个文件放在一起winrar解压就可以打开

工厂ERP系统对企业高效管理的好处是什么?

对于工厂类企业来说,无论是小到厨具工厂,大到汽车工厂,再到航天设备工厂,其生产流程都是复杂,从开始的产品设计到零部件等所有物料的采购,再到生产组装,测试再调试,再到完成,需要经历几十上千步工序与细节,工厂的管理工作难度,那是相当大,但是,随着数据信息化系统的普及,工厂类企业实现智能高效化管理的愿望,得以实现,在这里,我们以工厂ERP系统为例,讲述一下工厂ERP系统对工厂类企业实现智能高效化管理的作用. 1.各环节工作,无缝流转 信息的沟通直观重要,对于企业来说,信息的沟通越是顺通,那么办公效率也

linux进程管理

进程管理 进程 Process 某应用程序打开的进程 PID Process ID 类型: 用户空间进程 内核空间进程 静态查看进程的状态 # ps [[email protected] ~]# ps >>>>查看本终端的进程 PID TTY          TIME CMD 4206 pts/0    00:00:00 bash 4378 pts/0    00:00:00 ps 选项的使用方式: BSD风格:选项没有横线- ps aux SysV风格:选项需要带有横线-