现在的位置: 首页 > 综合 > 正文

【iOS开发-50】利用创建新的类实现代码封装,从而不知不觉实践一个简单的MVC实验,附带个动画

2017年03月21日 ⁄ 综合 ⁄ 共 3393字 ⁄ 字号 评论关闭

接上次案例谈代码封装。上次案例见:【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值。

——V就是View,视图。

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

——C就是Controller,控制器。   

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

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

xibView.jiuGongGe=_arr1[index];

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

——因为全部是因为点击按钮而起,所以这些代码主要写在按钮的点击事件中的。

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

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

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

——其次,在按钮点击方法中,调用tipView方法,需要用[XibView tipsView],而不能用self,因为调用这个按钮点击事件的是按钮,所以self是按钮,不能用self。

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

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

+(UILabel *)tipsView{
    NSArray *xibArr=[[NSBundle mainBundle]loadNibNamed:@"ourXib" owner:nil options:nil];
    return [xibArr firstObject];
}

- (IBAction)installClick:(UIButton *)btn {
    //改变按钮文字已经设置为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];
}

最终效果:

抱歉!评论已关闭.