iOS开发UI篇—实现UItableview控件数据刷新

简介:

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

二、实现效果

1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作).

运行界面:

点击选中行:

修改数据后自动刷新:

三、代码示例

数据模型部分:

YYheros.h文件

复制代码
 1 //  2 // YYheros.h
 3 // 10-英雄展示(数据刷新)
 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 YYheros : NSObject
13 @property(nonatomic,copy)NSString *name;
14 @property(nonatomic,copy)NSString *icon;
15 @property(nonatomic,copy)NSString *intro;
16 17 //-(instancetype)initWithDict:(NSDictionary *)dict;
18 //+(instancetype)herosWithDict:(NSDictionary *)dict; 19 YYinitH(hero)
20 @end
复制代码

YYheros.m文件

复制代码
 1 //  2 // YYheros.m
 3 // 10-英雄展示(数据刷新)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYheros.h" 10 11 @implementation YYheros
12 //-(instancetype)initWithDict:(NSDictionary *)dict
13 //{
14 // if (self=[super init]) { 15 //// self.name=dict[@"name"];
16 //// self.icon=dict[@"icon"];
17 //// self.intro=dict[@"intro"]; 18 // 19 // //使用KVC
20 // [self setValuesForKeysWithDictionary:dict];
21 // }
22 // return self;
23 //}
24 // 25 //+(instancetype)herosWithDict:(NSDictionary *)dict
26 //{
27 // return [[self alloc]initWithDict:dict];
28 //} 29 YYinitM(hero)
30 @end
复制代码

主控制器 YYViewController.m文件

复制代码
 1 //  2 // YYViewController.m
 3 // 10-英雄展示(数据刷新)
 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 "YYheros.h"  11  12 @interface YYViewController ()<UITableViewDataSource,UIAlertViewDelegate,UITableViewDelegate>
 13 @property (strong, nonatomic) IBOutlet UITableView *tableview;
 14 @property(nonatomic,strong)NSArray *heros;
 15 @end  16  17 @implementation YYViewController
 18  19 - (void)viewDidLoad
 20 {
 21  [super viewDidLoad];
 22 //设置数据源  23 self.tableview.dataSource=self;
 24 self.tableview.delegate=self;
 25 self.tableview.rowHeight=60.f;
 26 NSLog(@"%d",self.heros.count);
 27 }
 28  29 #pragma mark -懒加载
 30 -(NSArray *)heros
 31 {
 32 if (_heros==nil) {
 33  34 NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"heros.plist" ofType:nil];
 35 NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];
 36  37 NSMutableArray *arrayM=[NSMutableArray array];
 38 for (NSDictionary *dict in temparray) {
 39 YYheros *hero=[YYheros herosWithDict:dict];
 40  [arrayM addObject:hero];
 41  }
 42 _heros=[arrayM mutableCopy];
 43  }
 44 return _heros;
 45 }
 46  47 #pragma mark- tableview的处理
 48 //多少组  49 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 50 {
 51 return 1;
 52 }
 53 //多少行  54 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 55 {
 56 return self.heros.count;
 57 }
 58 //每组每行的数据,设置cell  59 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 60 {
 61 //NSLog(@"cellForRowAtIndexPath 修改的了 %d", indexPath.row);
 62 //1.去缓存中取  63 static NSString *identifier=@"hero";
 64 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
 65 //2.如果没有,那么就自己创建  66 if (cell==nil) {
 67 NSLog(@"chuangjiancell");
 68 cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
 69  }
 70 //3.设置数据
 71  72 //3.1拿到该行的模型  73 YYheros *hero=self.heros[indexPath.row];
 74 cell.textLabel.text=hero.name;
 75 cell.imageView.image=[UIImage imageNamed:hero.icon];
 76 cell.detailTextLabel.text=hero.intro;
 77 //4.返回cell  78 return cell;
 79 }
 80  81 #pragma mark-数据刷新
 82 //1.弹出窗口,拿到数据
 83 //当某一行被选中的时候调用该方法  84 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 85 {
 86 //拿到改行的数据模型  87 YYheros *hero=self.heros[indexPath.row];
 88 UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"修改数据" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
 89  90 //密码框形式的
 91 //alert.alertViewStyle=UIAlertViewStyleSecureTextInput;  92 alert.alertViewStyle=UIAlertViewStylePlainTextInput;
 93 UITextField *text=[alert textFieldAtIndex:0];
 94 //把当前行的英雄数据显示到文本框中  95 text.text=hero.name;
 96 alert.tag=indexPath.row;
 97  [alert show];
 98 }
 99 //2.修改数据,完成刷新操作 100 -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
101 {
102 //1.修改模型
103 //如果选中的是取消,那么就返回,不做任何操作 104 if (0==buttonIndex) return;
105 //否则就修改模型,刷新数据 106 YYheros *hero=self.heros[alertView.tag];
107 108 //拿到当前弹窗中的文本数据(已经修改后的数据) 109 UITextField *text=[alertView textFieldAtIndex:0];
110 //用修改后的数据去修改模型 111 hero.name=text.text;
112 113 //2.刷新数据
114 // 只要调用tableview的该方法就会自动重新调用数据源的所有方法
115 // 会自动调用numberOfSectionsInTableView
116 // 会自动调用numberOfRowsInSection
117 // 会自动调用cellForRowAtIndexPath
118 // [self.tableview reloadData];
119 120 // 刷新指定行 121 NSIndexPath *path = [NSIndexPath indexPathForRow:alertView.tag inSection:0];
122  [self.tableview reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationRight];
123 //如果不进行刷新会怎么样?(修改之后不会即时刷新,要等到重新对cell进行数据填充的时候才会刷新) 124 }
125 //隐藏状态栏 126 -(BOOL)prefersStatusBarHidden
127 {
128 return YES;
129 }
130 @end
复制代码

四、把常用的代码封装成一个带参数的宏

封装方法和代码:

复制代码
 1 //  2 // Global.h
 3 // 10-英雄展示(数据刷新)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #ifndef _0____________Global_h
10 #define _0____________Global_h
11 12 /**
13  * 自定义带参数的宏
14 */ 15 #define YYinitH(name) -(instancetype)initWithDict:(NSDictionary *)dict;\
16 +(instancetype)herosWithDict:(NSDictionary *)dict;
17 18 19 #define YYinitM(name) -(instancetype)initWithDict:(NSDictionary *)dict\
20 {\
21 if (self=[super init]) {\
22  [self setValuesForKeysWithDictionary:dict];\
23  }\
24 return self;\
25 }\
26 \
27 +(instancetype)herosWithDict:(NSDictionary *)dict\
28 {\
29 return [[self alloc]initWithDict:dict];\
30 }\
31 32 #endif
复制代码

以后在需要使用的时候,只需要使用宏即可。

如在YYheros.m文件中使用YYinitM(hero)这一句代码可以代替下面的代码段:

复制代码
-(instancetype)initWithDict:(NSDictionary *)dict
{
 if (self=[super init]) {
// self.name=dict[@"name"];
// self.icon=dict[@"icon"];
// self.intro=dict[@"intro"];
 
 //使用KVC  [self setValuesForKeysWithDictionary:dict];
 }
 return self;
}

+(instancetype)herosWithDict:(NSDictionary *)dict
{
 return [[self alloc]initWithDict:dict];
}
复制代码

五、注意点

1.刷新数据的两个步骤:

1)修改模型

2)刷新表格数据(可以全部刷新,也可以刷新指定的行)

2.在主控制器文件中,遵守了三个协议

分别是:

UITableViewDataSource,

UIAlertViewDelegate,

UITableViewDelegate

目录
相关文章
|
8月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
277 15
|
8月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
313 11
|
4月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
418 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
7月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
281 56
|
7月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
401 55
|
8月前
|
存储 开发框架 API
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发二
本文详细介绍了基于声明式UI开发的健康饮食应用的设计与实现过程。内容涵盖从基础环境搭建到复杂功能实现的全流程,包括创建简单视图、构建布局(如Stack、Flex)、数据模型设计、列表与网格布局构建,以及页面跳转和数据传递等核心功能。 本文通过实际案例深入浅出地解析了声明式UI开发的关键技术和最佳实践,为开发者提供了宝贵的参考。
342 14
|
7月前
|
JavaScript 前端开发 开发者
09.HarmonyOS Next数据驱动UI开发:ForEach与动态渲染完全指南(上)
在现代前端开发中,数据驱动UI已成为主流开发范式。HarmonyOS Next的ArkTS语言和声明式UI框架完美支持这一理念,使开发者能够以更高效、更直观的方式构建复杂应用。
232 1
|
9月前
|
人工智能 物联网 编译器
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
270 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
|
10月前
|
关系型数据库 MySQL 数据库
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
2267 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
|
10月前
|
开发框架 缓存 自然语言处理
HarmonyOS ArkTS声明式UI开发实战教程
本文深入探讨了ArkTS作为HarmonyOS生态中新一代声明式UI开发框架的优势与应用。首先对比了声明式与命令式开发的区别,展示了ArkTS如何通过直观高效的代码提升可维护性。接着分析了其核心三要素:数据驱动、组件化和状态管理,并通过具体案例解析布局体系、交互组件开发技巧及复杂状态管理方案。最后,通过构建完整TODO应用实战,结合调试优化指南,帮助开发者掌握声明式UI设计精髓,感受ArkTS的独特魅力。文章鼓励读者通过“破坏性实验”建立声明式编程思维,共同推动HarmonyOS生态发展。
601 3

热门文章

最新文章