iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局

简介:

一、项目文件结构和plist文件

二、实现效果

三、代码示例

1.没有使用配套的类,而是直接使用xib文件控件tag值操作

数据模型部分:

YYtg.h文件

复制代码
 1 //  2 // YYtg.h
 3 // 01-团购数据显示(没有配套的类)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import <Foundation/Foundation.h>
10 #import "Global.h" 11 12 @interface YYtg : NSObject
13 @property(nonatomic,copy)NSString *buyCount;
14 @property(nonatomic,copy)NSString *icon;
15 @property(nonatomic,copy)NSString *price;
16 @property(nonatomic,copy)NSString *title;
17 YYinitH(tg)
18 @end
复制代码

YYtg.m文件

复制代码
 1 //  2 // YYtg.m
 3 // 01-团购数据显示(没有配套的类)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYtg.h" 10 11 @implementation YYtg
12 YYinitM(tg)
13 @end
复制代码

主控制器

YYViewController.m文件

复制代码
 1 //  2 // YYViewController.m
 3 // 01-团购数据显示(没有配套的类)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 #import "YYtg.h" 11 12 @interface YYViewController ()<UITableViewDataSource>
13 @property(nonatomic,strong)NSArray *tg;
14 @property (strong, nonatomic) IBOutlet UITableView *tableview;
15 16 @end 17 18 @implementation YYViewController
19 20 - (void)viewDidLoad
21 {
22  [super viewDidLoad];
23 self.tableview.rowHeight=100;
24 25 }
26 27 #pragma mark- 懒加载
28 -(NSArray *)tg
29 {
30 if (_tg==nil) {
31 NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];
32 NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];
33 34 NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];
35 for (NSDictionary *dict in temparray) {
36 YYtg *tg=[YYtg tgWithDict:dict];
37  [arrayM addObject:tg];
38  }
39 _tg=[arrayM mutableCopy];
40  }
41 return _tg;
42 }
43 44 #pragma mark-数据显示
45 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
46 {
47 return 1;
48 }
49 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
50 {
51 return self.tg.count;
52 }
53 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
54 {
55 //读取xib中的数据
56 // NSArray *arrayM=[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil];
57 // UITableViewCell *cell=[arrayM firstObject]; 58 static NSString *identifier=@"tg";
59 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
60 if (cell==nil) {
61 // cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; 62 cell= [[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil] firstObject];
63  }
64 65 YYtg *tg=self.tg[indexPath.row];
66 //设置数据
67 //使用tag 68 UIImageView *imgv=(UIImageView *)[cell viewWithTag:1];
69 imgv.image=[UIImage imageNamed:tg.icon];
70 UILabel *buyCount=(UILabel *)[cell viewWithTag:4];
71 buyCount.text=[NSString stringWithFormat:@"已有%@人购买",tg.buyCount];
72 UILabel *title=(UILabel *)[cell viewWithTag:2];
73 title.text=tg.title;
74 UILabel *price=(UILabel *)[cell viewWithTag:3];
75 price.text=[NSString stringWithFormat:@"$%@",tg.price];
76 77 78 //返回cell 79 return cell;
80 }
81 82 //隐藏状态栏 83 -(BOOL)prefersStatusBarHidden
84 {
85 return YES;
86 }
87 @end
复制代码

使用xib自定义的UItableviewcell

代码分析:

上面的代码通过使用xib文件中各个控件的tag值,完成对每个部分数据的赋值和刷新。但是,作为主控制器,它应该知道xib文件中各个控件的tag值,它知道的是不是太多了呢?

为了解决上面的问题,我们可以为自定义的cell设置一个配套的类,让这个类来操作这个xib,对外提供接口,至于内部的数据处理,外界不需要关心,也不用关心。

改造后的代码如下:

2.使用xib和对应的类完成自定义cell的数据展示

新建一个类,用来管理对应的xib文件

注意类的继承类,并把该类和xib文件进行关联

YYtgcell.h文件代码:

复制代码
 1 //  2 // YYtgcell.h
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import <UIKit/UIKit.h>
10 #import "YYtg.h" 11 12 @interface YYtgcell : UITableViewCell
13 @property(nonatomic,strong)YYtg *yytg;
14 15 @end
复制代码

YYtgcell.m文件

复制代码
 1 //  2 // YYtgcell.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYtgcell.h" 10 //私有扩展 11 @interface YYtgcell()
12 @property (strong, nonatomic) IBOutlet UIImageView *img;
13 @property (strong, nonatomic) IBOutlet UILabel *titlelab;
14 @property (strong, nonatomic) IBOutlet UILabel *pricelab;
15 @property (strong, nonatomic) IBOutlet UILabel *buycountlab;
16 @end 17 @implementation YYtgcell
18 19 #pragma mark 重写set方法,完成数据的赋值操作
20 -(void)setYytg:(YYtg *)yytg
21 {
22 _yytg=yytg;
23 self.img.image=[UIImage imageNamed:yytg.icon];
24 self.titlelab.text=yytg.title;
25 self.pricelab.text=[NSString stringWithFormat:@"$%@",yytg.price];
26 self.buycountlab.text=[NSString stringWithFormat:@"已有%@人购买",yytg.buyCount];
27 }
28 @end
复制代码

主控制器

YYViewController.m文件

复制代码
 1 //  2 // YYViewController.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 #import "YYtg.h" 11 #import "YYtgcell.h" 12 13 @interface YYViewController ()<UITableViewDataSource,UITableViewDelegate>
14 @property (strong, nonatomic) IBOutlet UITableView *tableview;
15 16 @property(strong,nonatomic)NSArray *tg;
17 @end 18 19 @implementation YYViewController
20 21 - (void)viewDidLoad
22 {
23  [super viewDidLoad];
24 self.tableview.rowHeight=80.f;
25 }
26 #pragma mark- 懒加载
27 -(NSArray *)tg
28 {
29 if (_tg==nil) {
30 NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];
31 NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];
32 33 NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];
34 for (NSDictionary *dict in temparray) {
35 YYtg *tg=[YYtg tgWithDict:dict];
36  [arrayM addObject:tg];
37  }
38 _tg=[arrayM mutableCopy];
39  }
40 return _tg;
41 }
42 43 44 #pragma mark- xib创建cell数据处理
45 #pragma mark 多少组
46 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
47 {
48 return 1;
49 }
50 #pragma mark多少行
51 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
52 {
53 return self.tg.count;
54 }
55 #pragma mark设置每组每行
56 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
57 {
58 static NSString *identifier= @"tg";
59 YYtgcell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
60 if (cell==nil) {
61 //如何让创建的cell加个戳
62 //对于加载的xib文件,可以到xib视图的属性选择器中进行设置 63 cell=[[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil]firstObject];
64 NSLog(@"创建了一个cell");
65  }
66 67 //设置cell的数据
68 //获取当前行的模型 69 YYtg *tg=self.tg[indexPath.row];
70 cell.yytg=tg;
71 return cell;
72 }
73 74 -(BOOL)prefersStatusBarHidden
75 {
76 return YES;
77 }
78 79 @end
复制代码

3.对上述代码进行进一步的优化和调整(MVC)

优化如下:

(1)把主控制器中创建cell的过程抽取到YYtgcell中完成,并对外提供一个接口。

YYtgcell.h文件(提供接口)

复制代码
1 #import <UIKit/UIKit.h>
2 #import "YYtgModel.h" 3 4 @interface YYtgcell : UITableViewCell
5 @property(nonatomic,strong)YYtgModel *yytg;
6 7 //把加载数据(使用xib创建cell的内部细节进行封装) 8 +(instancetype)tgcellWithTableView:(UITableView *)tableView;
9 @end
复制代码

YYtgcell.m文件(把创建自定义cell的部分进行封装)

复制代码
 1 //  2 // YYtgcell.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYtgcell.h" 10 //私有扩展 11 @interface YYtgcell()
12 @property (strong, nonatomic) IBOutlet UIImageView *img;
13 @property (strong, nonatomic) IBOutlet UILabel *titlelab;
14 @property (strong, nonatomic) IBOutlet UILabel *pricelab;
15 @property (strong, nonatomic) IBOutlet UILabel *buycountlab;
16 @end 17 @implementation YYtgcell
18 19 #pragma mark 重写set方法,完成数据的赋值操作
20 -(void)setYytg:(YYtgModel *)yytg
21 {
22 _yytg=yytg;
23 self.img.image=[UIImage imageNamed:yytg.icon];
24 self.titlelab.text=yytg.title;
25 self.pricelab.text=[NSString stringWithFormat:@"$%@",yytg.price];
26 self.buycountlab.text=[NSString stringWithFormat:@"已有%@人购买",yytg.buyCount];
27 }
28 29 +(instancetype)tgcellWithTableView:(UITableView *)tableView
30 {
31 static NSString *identifier= @"tg";
32 YYtgcell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
33 if (cell==nil) {
34 //如何让创建的cell加个戳
35 //对于加载的xib文件,可以到xib视图的属性选择器中进行设置 36 cell=[[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil]firstObject];
37 NSLog(@"创建了一个cell");
38  }
39 return cell;
40 }
41 42 @end
复制代码

主控器中的业务逻辑更加清晰,YYViewController.m文件代码如下

复制代码
 1 //  2 // YYViewController.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYViewController.h" 10 #import "YYtgModel.h" 11 #import "YYtgcell.h" 12 13 @interface YYViewController ()<UITableViewDataSource,UITableViewDelegate>
14 @property (strong, nonatomic) IBOutlet UITableView *tableview;
15 16 @property(strong,nonatomic)NSArray *tg;
17 @end 18 19 @implementation YYViewController
20 21 - (void)viewDidLoad
22 {
23  [super viewDidLoad];
24 self.tableview.rowHeight=80.f;
25 }
26 #pragma mark- 懒加载
27 -(NSArray *)tg
28 {
29 if (_tg==nil) {
30 NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];
31 NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];
32 33 NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];
34 for (NSDictionary *dict in temparray) {
35 YYtgModel *tg=[YYtgModel tgWithDict:dict];
36  [arrayM addObject:tg];
37  }
38 _tg=[arrayM mutableCopy];
39  }
40 return _tg;
41 }
42 43 44 #pragma mark- xib创建cell数据处理
45 46 #pragma mark 多少组
47 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
48 {
49 return 1;
50 }
51 52 #pragma mark多少行
53 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
54 {
55 return self.tg.count;
56 }
57 58 #pragma mark设置每组每行
59 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
60 {
61 //1.创建cell 62 YYtgcell *cell=[YYtgcell tgcellWithTableView:tableView];
63 64 //2.获取当前行的模型,设置cell的数据 65 YYtgModel *tg=self.tg[indexPath.row];
66 cell.yytg=tg;
67 68 //3.返回cell 69 return cell;
70 }
71 72 #pragma mark- 隐藏状态栏
73 -(BOOL)prefersStatusBarHidden
74 {
75 return YES;
76 }
77 78 @end
复制代码

四、推荐调整的项目文件结构

这是调整后的文件结构,完整的MVC架构。

注意:注意文件的命名规范。

提示技巧:批量改名,操作如下:

修改为想要的名称:

目录
相关文章
|
9月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
487 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
10月前
「Mac畅玩鸿蒙与硬件51」UI互动应用篇28 - 模拟记账应用
本篇教程将介绍如何创建一个模拟记账应用,通过账单输入、动态列表展示和实时统计功能,学习接口定义和组件间的数据交互。
326 68
「Mac畅玩鸿蒙与硬件51」UI互动应用篇28 - 模拟记账应用
|
10月前
|
人工智能 自然语言处理 API
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
UI-TARS Desktop 是一款基于视觉语言模型的 GUI 代理应用,支持通过自然语言控制电脑操作,提供跨平台支持、实时反馈和精准的鼠标键盘控制。
2797 17
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
|
11月前
|
前端开发
「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏
本篇教程将带你实现一个数字填色小游戏,通过简单的交互逻辑,学习如何使用鸿蒙开发组件创建趣味性强的应用。
248 20
「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏
|
10月前
|
UED
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
本篇教程将实现一个模拟火车票查询系统,通过输入条件筛选车次信息,并展示动态筛选结果,学习事件处理、状态管理和界面展示的综合开发技巧。
252 13
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
|
11月前
|
前端开发 UED
「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏
本篇教程将带你实现一个水果掉落小游戏,掌握基本的动态交互逻辑和鸿蒙组件的使用,进一步了解事件处理与状态管理。
238 14
「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏
|
10月前
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。
240 10
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
|
6月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
199 15
|
6月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
212 11
|
2月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
211 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例

热门文章

最新文章