接下来说说代码封装最后一个个案。

最后一种情况看:【iOS开展-48】九宫格案例:自己主动布局、字典转模型运用、id和instancetype差别、xib反复视图运用及与nib关系

(1)代码封装的原则是:要保证视图控制器尽量少的接触到其它对象的属性,也就是说,尽量把数据或者属性封装到一个类里面,然后利用类或者对象的方法来调用或者设置数据。而是赤裸裸地把属性都写在视图控制器中。

核心作用在于:降低视图控制器的代码量,把数据和属性的处理封装起来,这样也便于其它视图控制器的使用。

要做到的结果就是例如以下(我们要依据数组里面的对象个数循环创建视图):

——我们把之前的xib的UIView改为XibView(当然,也是继承自UIView)由于我们须要对原来的UIView进行改进定制

——创建了一个xibView后,就设置它的位置

——然后填充数据。这里填充数据也封装在了XibView类里面

——最后把这个xibView载入到当前视图中显示

    for (int index=0; index<self.arr1.count; index++) {
//计算这个app在几行几列
int row=index/totalColumns;
int col=index%totalColumns; //创建一个视图
XibView *xibView=[XibView xibView]; //设置位置
xibView.frame=CGRectMake(marginX+col*(marginX+appW), 30+row*(marginY+appH), appW, appH); //设置数据
xibView.jiuGongGe=_arr1[index]; //载入
[self.view addSubview:xibView];
}

所以,我们须要创建一个继承自UIView的类XibView,而且把xib里面的那个view设置成继承自XibView:

在XibView.h中:

#import <UIKit/UIKit.h>
#import "JiuGongGe.h" @interface XibView : UIView
@property(nonatomic,weak) JiuGongGe *jiuGongGe;
+(XibView *)xibView;
@end

在XibView.m中:

#import "XibView.h"

@interface XibView()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *labelView;
@end @implementation XibView
//这个XibView类能够直接用[XibView xibView]实现。模仿[NSArray array]的使用方法,直接创建一个对象
+(XibView *)xibView{
NSArray *xibArr=[[NSBundle mainBundle]loadNibNamed:@"ourXib" owner:nil options:nil];
return [xibArr lastObject];
}
//重写jiuGongGe的setter方法
-(void)setJiuGongGe:(JiuGongGe *) jiuGongGe{
_jiuGongGe=jiuGongGe;
self.iconView.image=[UIImage imageNamed:jiuGongGe.icon];
self.labelView.text=jiuGongGe.name;
}
@end

——什么属性和方法放在.h里或者.m里。推断根据是。假设在外部须要调用这个属性和方法,那么就写在.h里,不然写在.m里无法调用。

(2)纵观整个案例克制到眼下为止,事实上我们相当于实践了一个简单的MVC。

——M就是Modal,数据模型。

事实上。数据模型。在我们这里面是最轻松的。它就是一个类,这个类定义了2个属性,然后在这个类内部把字典转化成对象,即调用这个对象的属性,就相当于调用这个字典的KEY值。

&#30;

——V就是View。视图。

视图就是我们这里的xib小视图。我们除了在这里面实现子视图控件的初始化之外。还在这里实现了数据模型(数据)的填充,当然,这个数据模型须要控制器传递给视图,视图才干在内部填充。

——C就是Controller。控制器。

控制器最累。它须要支配数据模型和视图。最核心的就是它须要把数据模型传递给视图,让视图把这些数据经过一番处理然后显示出来。

体如今下面语句:

_arr1[index]是调用了数据模型里的数据(事实上是一个对象)。然后把它赋值给视图也就是xibView的一个属性,这个属性就负责解构这个数据模型(由于重写了这个属性的setter方法)。然后把里面的数据分别给子控件去显示。

xibView.jiuGongGe=_arr1[index];

(3)附带一个动画。点击下载button。button不在可点,文字变成已安装,并淡入淡出一个label提示框。

——由于所有是由于点击button而起,所以这些代码主要写在button的点击事件中的。

——在xib中画一个UILabel,设置为xib的第一个对象,用[xibArr firstObject]调用。这样也不会影响到我们之前用lastObject调用应用小视图的代码。

——在.h中写一个初始化这个UILabel的类方法tipsView,并在.m中实现,例如以下,就是用上面那条实现的,也就是说调用我们这个tipsView就相当于创建了一个UILabel。

——在button点击方法中。首先设置button文字和状态不可点击。

——其次,在button点击方法中,调用tipView方法,须要用[XibView tipsView],而不能用self。由于调用这个button点击事件的是button,所以self是button,不能用self。

——接着设置这个tipsView的文字和背景样式。

——最后载入到主视图中,当然这个载入过程能够用UIView beginAnimation这一套简易动画来实现。

+(UILabel *)tipsView{
NSArray *xibArr=[[NSBundle mainBundle]loadNibNamed:@"ourXib" owner:nil options:nil];
return [xibArr firstObject];
} - (IBAction)installClick:(UIButton *)btn {
//改变button文字已经设置为disable
[btn setTitle:@"已安装" forState:UIControlStateDisabled];
btn.enabled=NO;
//调用方法创建UILabel
UILabel *tipsLabel=[XibView tipsView];
//设置UILabel显示位置
CGFloat tipW=250;
CGFloat tipH=30;
tipsLabel.frame=CGRectMake((self.superview.superview.frame.size.width-tipW)/2, self.superview.superview.frame.size.height/2, tipW, tipH);
//设置UILabel文字和背景样式
tipsLabel.text=[NSString stringWithFormat:@"%@ 已经成功安装!",_labelView.text];
tipsLabel.textColor=[UIColor whiteColor];
tipsLabel.backgroundColor=[UIColor grayColor];
tipsLabel.font=[UIFont systemFontOfSize:14];
//设置显示时候的动画。透明和不透明的变化
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:5.0];
[self.superview.superview addSubview:tipsLabel];
tipsLabel.alpha=0;
tipsLabel.alpha=1;
tipsLabel.alpha=0;
[UIView commitAnimations];
}

终于效果:

版权声明:本文博主原创文章。博客,未经同意不得转载。

【iOS开展-50】使用它来创建一个新的类的实现代码包,因此,不自觉地练习简单MVC实验,附带动画的更多相关文章

  1. 【Cocos2d-x for WP8 学习整理】(1)创建一个新项目

    喜大普奔                         10.1假期之前看到了一个很振奋的消息,就是随着Cocos2d-x 2.2的发布,WP8/WIN8有史以来第一次的合并到主版本了. 之前 V2 ...

  2. cocos2dx 3.x版本搭建Mac环境工程(创建一个新的C++工程)百分百可行

    首先第一篇,想学cocos2dx第一步就是搭建环境,第一步搭建不了环境,创建不了工程那一切都是扯淡. 说到mac下安装cocos2d-x想到的模式就是xcode+cocos2d-x.因为我本身就是一个 ...

  3. [Xcode 实际操作]九、实用进阶-(28)在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP

    目录:[Swift]Xcode实际操作 本文将演示如何在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP. 首先要做的是打开浏览器,并进入[iTunesConnect网站], ...

  4. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

  5. Step by Step 创建一个新的Dynamics CRM Organization

    原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...

  6. Step by step 如何创建一个新森林

    原创地址:http://www.cnblogs.com/jfzhu/p/4006118.html 转载请注明出处 创建一个新森林就是在一台计算机上安装AD DS,并将这台计算机提升为域控制器. 演示环 ...

  7. ZeroMQ接口函数之 :zmq_ctx_new – 创建一个新的ZMQ 环境上下文

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_ctx_new zmq_ctx_new(3)               ØMQ Manual - ØMQ/3.2 ...

  8. 第六周——分析Linux内核创建一个新进程的过程

    "万子恵 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 &q ...

  9. 分析Linux内核创建一个新进程的过程

    一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct ...

随机推荐

  1. 建立Hibernate二级Cache

    建立Hibernate二级Cache它需要两个步骤:首先,一定要使用什么样的数据并发策略,然后配置缓存过期时间,并设置Cache提供器. 有4种内置的Hibernate数据并发冲突策略,代表数据库隔离 ...

  2. C++ 哈希表 (hashtable) 用于保存简单的数据,及数据查找,数据删除

    /*hashtable.h*/ #include<iostream> #include <string> #include<vector> using namesp ...

  3. 玩转web之servlet(六)---session介绍及简单使用(登录验证中保存信息)

    在浏览器与服务器进行交互时,往往需要把涉及到的一些数据保存下来,这时就需要使用cookie或session进行状态管理. 这篇文章先来说说session怎么用,首先在servlet中创建一个sessi ...

  4. Java应用中使用ShutdownHook友好地清理现场(转)

    在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.Java中得ShutdownHook提供了比较好的方案. JDK在1.3之后提 ...

  5. —页面布局实例———win7自己的小算盘

    晚上7各地点布局,9点半,刚拿到. 他发现自己专注的时候效率挺高真的哈萨克斯坦.计算器布局前.做了两件简单的页面布局练练手.今晚总体感觉更好,不难. 器之间调试有点蛋疼,真心不想搭理IE. 在进行布局 ...

  6. perl操作sqlserver实现BCP

    #!C:\Perl64\bin #由BCP备份和恢复SQLSERVER指定表 use 5.014; #加载用户和password型材 my $username ; my $passwd; ##得到us ...

  7. Android新建项目后src下没有自动生成文件

    最近开始学Android了,按照教材新建了一个项目,发现src下没有自动生成文件,怎么回事呢? 出现这种可能的原因很可能是ADT与SDK版本不同,造成不兼容. 在ADT(或者eclipse)中的hel ...

  8. linux 下一个 osw先从操作系统和标准脚本主动发起

    linux 下一个 osw与操作系统的引导和启动标准的脚本.osw它指的是--os watcher,这是一个显示器os这些指标shell脚本.osw监测数据一般使用oracle技能评估os资源的使用, ...

  9. ios 多线程开发(二)线程管理

    线程管理 iOS和OS X中每一个进程(或程序)由一个或多个线程组成.程序由一个运行main方法的线程开始,中间可以产生其他线程来执行一些指定的功能. 当程序产生一个新线程后,这个线程在程序进程空间内 ...

  10. 告别乱码,针对GBK、UTF-8两种编码的智能URL解码器的java实现(转)

    效果图 字符 字符是早于计算机而存在,从人类有文明那时起,人们就用一个个符号代表世间万象.如ABC,如“一.二.三”. 字符集 字符集是所有字符的集合. XXX字符集 给字符集中的每一个字符套上一个序 ...