【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值。

&#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];
}

终于效果:

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

时间: 2024-10-06 14:14:26

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

创建一个单例类

关于单例的概念此处不做表述,直接上代码演示如何创建一个单例类. 1 #import <Foundation/Foundation.h> 2 3 @interface MJDemo : NSObject 4 5 + (instancetype)sharedDemo; 6 7 @end 8 9 10 #import "MJDemo.h" 11 12 @implementation MJDemo 13 14 //在iOS中所有对象分配内存空间,最终都会调用allocWithZon

Photoshop脚本 &gt; 使用脚本创建一个新文档

源自:http://coolketang.com/tutorials/menu2lesson1.php 本节将演示如何使用脚本,创建一个空白文档.首先创建一个空白的脚本文档,并保存在硬盘上某个位置. 接着输入脚本代码: //定义一个变量[Width],表示新文档的宽度. var width = 560; //定义一个变量[height],表示新文档的高度. var height = 560; //定义一个变量[resolution],表示新文档的分辨率. var resolution = 72;

分析Linux内核创建一个新进程的过程【转】

转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用,来分析Linux内核创建新进程的过程 关键词:fork, 系统调用,进程 *运行环境:** Ubuntu 14.04 LTS x64 gcc 4.9.2 gdb 7.8 vim 7.4 with vundle 分析 分析方法说明 PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时

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

潘恒 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  unsigned int rt_priority;实时优先级  unsigned int policy;调度策略  struct files

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

一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct{ volatile long state; //进程状态,-1表示不可执行,0表示可执行,大于1表示停止 void *stack; //内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 unsigned int ptrace; …… } 2.进程的创

用eclipse pydev 创建一个新py文件时 文件的coding设置问题

问题: 当安装好eclipse和pydev后,创建一个project, 创建一个新的py文件,文件头都会自带中文时间.这样在编译的时候会报错. 解决办法之一: 通过设置,可以使新建的文件的文件头自动带一行#coding=utf-8 设置之后,再创建一个新的文件.文件的文件头会自带#coding=utf-8 待续 还有其他方法的朋友,欢迎交流.

struts2每次访问都会创建一个新的session

项目在测试过程中,突然发现登陆之后再去访问其他菜单时都会提示未登录: 查看日志之后发现是因为很多次请求时都会自动创建一个新的session,这就费解了, 因为之前也没改动什么session创建的机制,tomcat也没改动,但是突然就这样了,和常理不通: 经过多方调试,删除tomcat重新安装,重新部署项目,然后在请求时就是同一个session了,恢复正常! Why ? Why ? 在网上搜了一片文章不错: 1.http://m.blog.csdn.net/blog/www89404565/207

soapui中文操作手册(一)----创建一个新的项目

1) 创建一个新的项目 点击项目,选择新建项目SOAP.这将打开一个新的SOAP项目对话框. 注意:你也可以做CTRL + N(WIN)或CMD+ N(MAC)来创建一个新的SOAP项目. 在新的SOAP项目对话框中输入项目名称,然后单击确定 这将创建在导航器一个新的项目. 恭喜你,你刚刚创建了你的第一个项目SoapUI.让我们添加一个WSDL. 2) 添加一个WSDL 在SoapUI项目中,SOAP大多是基于一个WSDL.虽然不是必须通过导入WSDL,但它使测试更容易,因为WSDL包含您需要了

Android 创建一个新的Activity

本文转载自:http://www.cnblogs.com/wuyudong/p/5658020.html 新建一个项目,创建一个java类,继承自Activity 新建一个Android.xml文件:activity_test.xml 这里需要在清单文件里面配置一下 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.