ios开发-UI基础-应用管理(单纯界面)改进4-xib封装

  [注意]转载请注明出处:吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 

  上篇文章结尾介绍了一下为什么要对xib进行封装,这里不再赘述.

  大体整理了一下封装的思路(我自己的想法,可能不是很清晰):

  为了扩展,将xib的代码封装,创建一个类,来描述xib
    >在新建的.m文件中,新建一个类扩展(类似于viewController)
    >在新建的.h文件中,加入一个模型的属性(@class)
    >在新建的.m文件中,重写模型的set方法(在.h文件中已经加入了,自动生成了set/get方法)(#import)
    >加载xib的方法在控制器中,假设多个控制器使用,为了扩展性好,封装到新建的类中,写一个类方法来实现加载xib
    >在控制器中调用的时候,直接使用类方法即可.

   使用xib,将应用管理的界面,搭建出来,在控制器中通过NSBundle获取xib数据(返回一个数组),然后获取其中的控件,分别赋值.
          此时,考虑到多控制器使用的话,每个控制器都要写相同的代码(获取xib,更新数据,而且假设要扩展的话,每个都要修改),为了扩展性好,新建一个类来描述xib(类似于     viewcontroller文件描述storyboard一样),在这个新建的类中进行xib中的赋值,但是数据在控制器的模型中,所以先要得到数据.所以,在新建的类中要加一个模型的     属性,在新建的类的.m文件中,重写模型属性的set方法,在这个set方法中进行赋值.

在控制器中使用的时候,首先获取这个xib文件,注意返回的是一个新的view(新建的类),然后再后边,将数据赋值给创建的类的模型的属性即可

再次将xib文件的获取方法,进行封装,封装到新建的类中,写一个类方法,使用的时候直接调用类方法

应用代码结构截图:

xib文件拖线截图:

  

 1 自定义View。创建属性、传递Model进去。
 2 *自定义一个appview用来描述xib,然后我们需要把xib的真实类型改变为appview(必须有这一步)
 3 *用拖线的方式拿到里面的三个小的控件
 4 *给这些控件进行赋数据,数据在模型中,我们拥有一个模型属性,为了从控制器中拿到模型,我们重写模型的set方法,
 5 这样我们就可以通过set方法把控制器中的模型数据赋值给我们内部的模型,拿到模型后我们进行控件的赋值,
 6 //重写模型的set方法
 7 - (void)setAppViewModel:(AppViewModel *)appViewModel{
 8     _appViewModel = appViewModel;
 9
10
11     self.head.image = [UIImage imageNamed:appViewModel.icon];
12     self.nameLabel.text = appViewModel.name;
13
14
15 }
16 *这样我们就可以在控制器中直接赋值模型,然后显示数据
17 //        2.4赋值
18 AppViewModel *appViewModel = self.apps[i];
19
20
21 appOldView.appViewModel = appViewModel;
22
23
24
25
26
27 9. 封装创建View的代码, 让用户不知道是通过xib创建的还是通过代码创建的,安全,扩展性比较好。
28 * 封装一个类方法
29 + (instancetype )loadNib{
30     return  [[NSBundle mainBundle]loadNibNamed:@"appView" owner:nil options:nil][0];
31
32
33
34 }

  [注意]转载请注明出处:吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 

附上程序源代码:

  KZAppView.h

 1 //
 2 //  KZAppModel.h
 3 //  UI基础-03-05-14
 4 //
 5 //  Created by hukezhu on 15/5/15.
 6 //
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 /*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/
11 @interface KZAppModel : NSObject
12 /**
13  *  应用图标
14  */
15 @property (nonatomic ,copy) NSString *icon;
16 /**
17  *  应用名称
18  */
19 @property (nonatomic ,copy) NSString *name;
20
21 /**
22  *  通过字典来初始化对象
23  *
24  *  @param dict 字典对象
25  *
26  *  @return 已经初始化完毕的模型对象
27  */
28 - (instancetype)initWithDict:(NSDictionary *)dict;
29
30 //类方法
31 + (instancetype)appWithModelDict:(NSDictionary *)dict;
32
33 @end

KZAppView.m

 1 //
 2 //  KZAppModel.m
 3 //  UI基础-03-05-14
 4 //
 5 //  Created by hukezhu on 15/5/15.
 6 //
 7 //
 8
 9 #import "KZAppModel.h"
10
11 @implementation KZAppModel
12 /*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/
13 //对象方法
14 -(instancetype)initWithDict:(NSDictionary *)dict{
15
16     //重写构造方法的默认写法
17     if(self = [super init]){
18
19         //将字典的所有属性赋值给模型
20         self.icon = dict[@"icon"];
21         self.name = dict[@"name"];
22     }
23     return self;
24 }
25 //类方法
26 +(instancetype)appWithModelDict:(NSDictionary *)dict{
27
28     //注意此处是self
29     return [[self alloc]initWithDict:dict];
30 }
31 @end

  

  描述xib文件的AppView.h和AppView.m文件

AppView.h:

 1 //
 2 //  AppView.h
 3 //  UI基础-03-05-14
 4 //
 5 //  Created by hukezhu on 15/5/15.
 6 //
 7 //转载请注明出处:吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 
 8
 9 #import <UIKit/UIKit.h>
10 @class KZAppModel;
11 @interface AppView : UIView
12
13 //声明一个模型属性,用来接收传过来的模型数据
14 @property (nonatomic,strong)KZAppModel *appViewModel;
15
16 //用来加载xib
17 +(instancetype)loadNib;
18 @end

AppView.m

 1 //
 2 //  AppView.m
 3 //  UI基础-03-05-14
 4 //
 5 //  Created by hukezhu on 15/5/15.
 6 //
 7 //转载请注明出处:吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 
 8
 9 #import "AppView.h"
10 #import "KZAppModel.h"
11 @interface AppView ()
12 @property (nonatomic,weak)IBOutlet UIImageView *imageView;
13 @property (weak, nonatomic) IBOutlet UILabel *label;
14
15 -(IBAction)btnOnClick:(UIButton *)btn;
16 @end
17
18
19 @implementation AppView
20 //重写模型的set方法
21 -(void)setAppViewModel:(KZAppModel *)appViewModel{
22
23     _appViewModel = appViewModel;
24     self.imageView.image = [UIImage imageNamed:appViewModel.icon];
25     self.label.text = appViewModel.name;
26 }
27
28
29 +(instancetype)loadNib{
30
31     return [[NSBundle mainBundle]loadNibNamed:@"AppView" owner:nil options:nil][0];
32 }
33
34
35 /*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/
36 /**
37  *  按钮的点击方法
38  *
39  *  @param btn 将按钮本身传入方法中,哪个按钮被点击就调用这个方法
40  */
41 - (void)btnOnClick:(UIButton *)btn{
42
43     //NSLog(@"------%@",btn);
44     btn.enabled = NO;
45     [btn setTitle:@"已下载" forState:UIControlStateNormal];
46
47     CGFloat labelW = 120;
48     CGFloat labelH = 30;
49     CGFloat labelX = (self.superview.frame.size.width - labelW)* 0.5;
50     CGFloat labelY = (self.superview.frame.size.height - labelH)*0.5;
51     UILabel *label = [[UILabel alloc]init];
52     label.frame = CGRectMake(labelX, labelY, labelW, labelH);
53     label.text = @"正在下载";
54     //设置字体颜色
55     label.textColor = [UIColor redColor];
56     //设置字体居中
57     label.textAlignment = NSTextAlignmentCenter;
58     //设置 背景色
59     label.backgroundColor = [UIColor blackColor];
60
61     //设置圆角的半径
62     label.layer.cornerRadius = 8;
63     //将多余的部分减掉
64     label.layer.masksToBounds = YES;
65     //设置透明度
66     label.alpha = 0.0;
67     //将label添加到view中
68     [self.superview addSubview:label];
69     //使用block动画,动画持续时间2秒
70     [UIView animateWithDuration:2.0 animations:^{
71         label.alpha = 0.5;
72     } completion:^(BOOL finished) {
73         if (finished) {
74             [UIView animateWithDuration:2.0 delay:0.1 options:UIViewAnimationOptionCurveLinear animations:^{
75                 label.alpha = 0.0;
76             } completion:^(BOOL finished) {
77                 //上面将透明度设置为0,界面上已经不显示这个label,但是它仍然在内存中,所以为了节约内存,仍要将其从内存中删除
78                 [label removeFromSuperview];
79
80             }];
81         }
82     }];
83
84 }
85
86 @end

ViewController.m

  1 //
  2 //  ViewController.m
  3 //  03-应用管理
  4 //
  5 //  Created by hukezhu on 15/5/14.
  6 //
  7 //
  8
  9 #import "ViewController.h"
 10 #import "KZAppModel.h"
 11 #import "AppView.h"
 12
 13 @interface ViewController ()
 14 @property (nonatomic,strong)NSArray *apps;
 15 @end
 16
 17 @implementation ViewController
 18
 19 - (void)viewDidLoad {
 20     [super viewDidLoad];
 21
 22     //每一行的应用的个数
 23     int totalCol = 3;
 24     /*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/
 25
 26     //添加一个小的view
 27     CGFloat appW = 80;
 28     CGFloat appH = 100;
 29     CGFloat marginX = 20;
 30     CGFloat marginY = 20;
 31     CGFloat hightMargin = 30;
 32     CGFloat leftMargin = (self.view.frame.size.width - totalCol * appW - (totalCol - 1) *marginX)* 0.5;
 33
 34
 35
 36     for (int i = 0; i < self.apps.count; i++) {
 37
 38
 39         //计算行号和列号
 40         int row = i / totalCol;
 41         int col = i % totalCol;
 42
 43         CGFloat appX = leftMargin + (marginX + appW)* col;
 44         CGFloat appY = hightMargin + (marginY + appH)* row;
 45
 46         //1.添加view
 47
 48
 49         //首先拿到一个格子视图
 50 //        UIView *appView = [[NSBundle mainBundle]loadNibNamed:@"AppView" owner:nil options:nil][0];
 51
 52         AppView *appView = [AppView loadNib];
 53
 54
 55         //1.2设置frame
 56         appView.frame = CGRectMake(appX, appY, appW, appH);
 57         //1.3设置背景色(便于代码阶段验证,之后会删除)
 58         //appView.backgroundColor = [UIColor redColor];
 59         //1.4将这个appView添加到view中
 60         [self.view addSubview:appView];
 61
 62         //加载数据
 63         //NSDictionary *dict = self.apps[i];
 64         //将数据赋值给模型对象
 65         KZAppModel *appModel = self.apps[i];
 66
 67
 68         //通过数组的特性拿到里面的小控件,进行赋值
 69 //        UIImageView *imageView = (UIImageView *)appView.subviews[0];
 70 //        imageView.image = [UIImage imageNamed:appModel.icon];
 71 //
 72 //        UILabel *label = appView.subviews[1];
 73 //        label.text = appModel.name;
 74
 75
 76         appView.appViewModel = appModel;
 77
 78
 79
 80
 81 //        UIButton *downBtn = (UIButton *)appView.subviews[2];
 82 //        [downBtn addTarget:self action:@selector(btnOnClick:) forControlEvents:UIControlEventTouchUpInside];
 83
 84
 85 //        //2.添加图片UIImageView
 86 //        CGFloat imageW = 60;
 87 //        CGFloat imageH = 50;
 88 //        CGFloat imageX = (appW - imageW)*0.5;
 89 //        CGFloat imageY = 0;
 90 //        UIImageView *imageView = [[UIImageView alloc]init];
 91 //        imageView.frame = CGRectMake(imageX, imageY, imageW, imageH);
 92 //        //imageView.backgroundColor = [UIColor blueColor];
 93 //        //imageView.image = [UIImage imageNamed:dict[@"icon"]];
 94 //        //从模型对象中取出数据
 95 //        imageView.image = [UIImage imageNamed:appModel.icon];
 96 //        [appView addSubview:imageView];
 97 //
 98 //
 99 //        //3.添加应用名称
100 //
101 //        CGFloat labelW = 80;
102 //        CGFloat labelH = 25;
103 //        CGFloat labelX = 0;
104 //        CGFloat labelY = imageH;
105 //        UILabel *label = [[UILabel alloc]init];
106 //        label.frame = CGRectMake(labelX, labelY, labelW, labelH);
107 //        //label.backgroundColor = [UIColor grayColor];
108 //        //label.text = dict[@"name"];
109 //        //从模型对象中取出数据name
110 //        label.text = appModel.name;
111 //
112 //        //设置字体大小
113 //        label.font = [UIFont systemFontOfSize:13];
114 //        //设置字体居中
115 //        label.textAlignment = NSTextAlignmentCenter;
116 //        [appView addSubview:label];
117 //
118 //        //4.添加下载按钮
119 //
120 //        CGFloat downloadW = 60;
121 //        CGFloat downloadH = 25;
122 //        CGFloat downloadX = 10;
123 //        CGFloat downloadY = labelH + labelY;
124 //        UIButton *downloadBtn = [[UIButton alloc]init];
125 //        downloadBtn.frame = CGRectMake(downloadX, downloadY, downloadW, downloadH);
126 //        //downloadBtn.backgroundColor = [UIColor yellowColor];
127 //        //设置背景图片
128 //        [downloadBtn setBackgroundImage:[UIImage imageNamed:@"buttongreen"] forState:UIControlStateNormal];
129 //        [downloadBtn setBackgroundImage:[UIImage imageNamed:@"buttongreen_highlighted"] forState:UIControlStateHighlighted];
130 //        //设置字体第一种方法
131 //        [downloadBtn setTitle:@"下载" forState:UIControlStateNormal];
132 //
133 //        //设置字体第二种方法(不推荐使用)
134 //        downloadBtn.titleLabel.text = @"下载";
135 //
136 //        //设置字体大小
137 //        downloadBtn.titleLabel.font = [UIFont systemFontOfSize:15];
138 //        [appView addSubview:downloadBtn];
139 //
140 //
141 //        [downloadBtn addTarget:self action:@selector(btnOnClick:) forControlEvents:UIControlEventTouchUpInside];
142     }
143
144
145
146
147
148 }
149 /**
150  *  "懒加载",加载应用数据
151  *
152  */
153 - (NSArray *)apps{
154
155     //如果_apps为空,才加载数据
156     if (_apps == nil) {
157         //获取plist的全路径
158         NSString *path = [[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
159
160         //加载数组
161         NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];
162
163         //创建一个可变数组,来动态接收模型对象
164         NSMutableArray *array = [NSMutableArray array];
165
166         //通过循环,将字典数组的字典取出,转成模型对象
167         for (NSDictionary *dict in dictArray) {
168             KZAppModel *appModel = [KZAppModel appWithModelDict:dict];
169             [array addObject:appModel];
170         }
171         _apps = array;
172     }
173     return _apps;
174     /*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/
175 }
176
177 - (void)didReceiveMemoryWarning {
178     [super didReceiveMemoryWarning];
179     // Dispose of any resources that can be recreated.
180 }
181
182 @end

  这个应用管理小应用的代码目前就改进到此,代码中还有不合适的地方,以后再来改进.这个小实例比较综合,利用到了前面所说的知识,熟练掌握的话对后续深层次的学习大有好处.

转载请注明出处:博客园--吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/

时间: 2024-10-12 02:02:13

ios开发-UI基础-应用管理(单纯界面)改进4-xib封装的相关文章

ios开发-UI基础-应用管理(单纯界面)改进5-使用代理实现监听下载按钮的点击(delegate)

[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 前几篇文章介绍了一个应用管理的小应用,从最开始的单纯实现功能,一步一步就行改进\封装,上篇文章是使用xib进行了优化,本篇文章使用代理实现监听下载按钮的点击. 在原来的基础上,使用代理的主要思路分析: 首先要新建一个协议 声明协议的要实现的方法(一般为optional) 声明一个遵守该协议的代理的属性 使用代理,通知其代理完成操作 在代理中的实现步骤: 遵守协议 设置代理(一般通过拖线

ios开发-UI基础-应用管理(单纯界面)改进2

本篇文章,通过字典转模型来改进上篇文章中的代码. 字典转模型,之前的文章已经介绍过,这里再重复一下:  字典转模型 字典:用来存储数据的,用键值对存储数据,是一个nsdictionary ,(不好处:key值容易写错) 模型: 用来存储数据的,一个字典对应一个模型,模型用属性来存储数据,是一个纯洁的object对象 @property(nonatomic,copy)NSString *name; @property(nonatomic,copy)NSString *icon; 字典转模型:一个字

ios开发-UI基础-应用管理(单纯界面)

功能分析 以九宫格的形式展示应用信息 点击下载按钮后,做出相应操作(弹出一个提示"正在下载",相应应用的下载按钮变为"已下载") 步骤分析 搭建UI界面 加载应用信息 根据应用的个数创建对应的view 监听下载按钮的点击 应用截图: 这个小的综合实例涉及到的知识点: UIView的常见属性和方法 九宫格的计算方法 字典转模型 xib的使用 view的封装 简单的MVC 九宫格分析: 搭建九宫格的步骤 明确每一块用的是什么view 明确每个view之间的父子关系 先尝

iOS开发UI基础—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

ios开发UI基础-使用纯代码自定义UItableviewcell实现一个简单的微博界面布局 一.实现效果 二.使用纯代码自定义一个tableview的步骤 1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame,  子控件要添加到contentView中) 进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片) 3.提供2个模型 数据模型:

IOS开发UI基础—在UIImageView中添加按钮以及Tag的参数说明

ios开发UI基础-在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwithtag: 提示点:在xib中如果想要通过tag参数获取对应的控件(属性),不要把tag的参数设置为0,因为xib中所有的对象默认tag都为0,设置为0取不到对象. 二.ImageView中添加按钮(1)ImageView和Button的比较 Button按钮的内部可以放置多张图片(4),而Im

iOS开发UI基础—xib的简单使用

iOS开发UI基础-xib的简单使用 一.简单介绍 xib和stotyboard的比较,一个轻量级一个重量级. 二.xib的简单使用 1.建立xib文件 建立的xib文件命名为appxib.xib 2.对xib进行设置 根据程序的需要,这里把view调整为自由布局 建立view模型(设置长宽等参数) 调整布局和内部的控件 完成后的单个view 3.使用xib文件的代码示例 YYViewController.m文件代码如下: 1 // 2 // YYViewController.m 3 // 10

iOS开发UI基础—简单的浏览器查看程序

iOS开发UI基础-简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边按钮 二.实现基本功能的程序 1 // 2 // YYViewController.m 3 // 03-图片浏览器初步 4 // 5 // Created by apple on 14-5-21. 6 // Copyright (c) 2014年 itcas

iOS开发UI基础—字典转模型(部分内容转载他人)

iOS开发UI基础-字典转模型 开发中,通常使用第三方框架可以很快的实现通过字典转模型,通过plist创建模型,将字典的键值对转成模型属性,将模型转成字典,通过模型数组来创建一个字典数组,通过字典数组来创建一个模型数组等等. 一.能完成功能的"问题代码" 1.从plist中加载的数据 2.实现的代码 1 // 2 // LFViewController.m 3 // 03-应用管理 4 // 5 // Created by apple on 14-5-22. 6 // Copyrigh

iOS开发UI基础—IOS开发中Xcode的一些使用技巧

iOS开发UI基础-IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文件 视图 option + cmd + 回车 打开助理编辑器 cmd + 回车           显示主窗口 cmd + 0             导航窗口 option + cmd + 0    工具窗口 在.m & .h之间切换           control + cmd + 上/下