zoukankan      html  css  js  c++  java
  • 【iOS开展-50】使用它来创建一个新的类的实现代码包,因此,不自觉地练习简单MVC实验,附带动画

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

    最后一种情况看:【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)附带一个动画。点击下载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];
    }

    终于效果:


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

  • 相关阅读:
    20100420 ~ 20100520 小结与本月计划
    打造第二代测试框架TestDriven 2.0(六)—— 最新测试思路分析
    C# 反射性能测试
    Java 反射与cglib.proxy与cglib.beanmap与直接赋值 性能对比
    Apache Mina 源码分析。
    msn in c#, 最新代码
    20100520 ~ 20100620 小结与本月计划
    messageflow 集成到信息系统 第一阶段 手稿
    flash > AMF > java 的对象映射关系
    我在想:也许.net的基因里面就输给了java
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4869259.html
Copyright © 2011-2022 走看看