iOS开发-UITableView表格优化

简介:

之前的一篇文章大概讲述了一下UITableView的使用,UITableView在iOS的地位和ListView在Android中的地位基本上算是不相上下,关于ListView的优化网上的也有很多文章。UITableView苹果公司本身就已经优化了其中的功能,不管你有多少数据,每次加载的时候只是加载当前页面的数据,以免造成不必要的内存占用。一个非常常见的优化就是使用Identifier,也就是唯一标示,将页面中不用的对象放在缓存池中,如果有新的对象出现从缓存池中取出。

页面布局

页面布局还是跟上篇文章一样,一个TableView:

 

不过需要额外的工作的时本次暂时的是服装信息,通过弹框修改服装的价格,需要新建一个服装类,实现UIAlertViewDelegate协议,头文件中的声明:

1
2
3
@interface  ViewController : UIViewController <UITableViewDataSource,UITableViewDelegate,UIAlertViewDelegate>
@property  (weak,  nonatomic IBOutlet  UITableView *tableView;
@end

服装类的定义:

1
2
3
4
5
6
7
8
9
@interface  Dress :  NSObject
 
@property  (strong, nonatomic NSString  *dressName;
 
@property  (strong, nonatomic NSString  *dressDetial;
 
@property  (strong, nonatomic NSString   *dressImage;
 
@end

优化与实现  

优化之前先实现一些必要的功能,以及一些方法的使用,上篇文章只是涉及了其中的一部分,为了更好的理解,可以先看下实现的效果:

定义存储数据的数组:

 

1
2
3
4
5
6
7
@interface  ViewController ()
{
     NSArray  *imageArr;
     NSArray  *dressArr;
     NSMutableArray  *dressList;
}
@end

 

初始化数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- ( void )viewDidLoad {
     [ super  viewDidLoad];
     // Do any additional setup after loading the view.
     imageArr=[[ NSArray  alloc]initWithObjects:@ "dress1.jpeg" ,@ "dress2.jpg" ,@ "dress3.jpg" , nil ];
     dressArr=[[ NSArray  alloc]initWithObjects:@ "七匹狼" ,@ "森马" ,@ "杰克琼斯" ,@ "美特斯邦威" ,@ "以纯" ,@ "真维斯" ,@ "海南之家" , nil ];
     dressList=[ NSMutableArray  arrayWithCapacity:30];
     for  ( NSInteger  i=0; i<30; i++) {
         Dress *dress=[[Dress alloc]init];
         NSInteger  imageRandom=arc4random_uniform(3);
         NSInteger  dressRandom=arc4random_uniform(7);
     
         NSInteger  price=arc4random_uniform(1000)+100;
         
         dress.dressImage=imageArr[imageRandom];
         dress.dressName=dressArr[dressRandom];
         dress.dressDetial=[ NSString  stringWithFormat:@ "促销价:%ld" ,( long )price];
         [dressList addObject:dress];
     }
}

 设置行数:

1
2
3
- ( NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:( NSInteger )section{
     return  [dressList count];
}

 设置分组:

1
2
3
- ( NSInteger )numberOfSectionsInTableView:(UITableView *)tableView{
     return  1;
}

 设置单元格内容,通过reuseIdentifier设置重用的单元格,dequeueReusableCellWithIdentifier取出可以重用的单元格:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath  *)indexPath{
     static  NSString  *flag=@ "cacheCell" ;
     //生成唯一的标记
     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:flag];
     if  (cell== nil ) {
         //设置需要显示详情的样式
         cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:flag];
     }
     Dress *dress=dressList[indexPath.row];
     
     UIImage *image=[UIImage imageNamed:dress.dressImage];
     [cell.imageView setImage:image];
     [cell.imageView setFrame:CGRectMake(0, 0, 80, 50)];
     [cell.textLabel setText:dress.dressName];
     //设置展示小箭头
     [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
     //设置Tag
//    [cell setTag:indexPath.row];
     
     [cell.detailTextLabel setText:dress.dressDetial];
     
     NSLog (@ "获取更新之后的行:%ld" ,indexPath.row);
     return  cell;
}

选中行之后的弹框设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- ( void )tableView:(UITableView *)tableView didSelectRowAtIndexPath:( NSIndexPath  *)indexPath{
     UIAlertView *alterView=[[UIAlertView alloc] initWithTitle:@ "服装价格:"  message: nil  delegate: self  cancelButtonTitle:@ "取消"  otherButtonTitles:@ "修改" nil ];
     [alterView setAlertViewStyle:UIAlertViewStylePlainTextInput];
     //选中的Cell
     UITableViewCell *cell=[tableView cellForRowAtIndexPath:indexPath];
     
     UITextField *textField=[alterView textFieldAtIndex:0];
     
     //设置修改的服装信息
     [textField setText:cell.detailTextLabel.text];
     
     [textField setTag:indexPath.row];
     [alterView  show];
}

 UIAlterView中的点击事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- ( void )alertView:(UIAlertView *)alertView clickedButtonAtIndex:( NSInteger )buttonIndex{
     if  (buttonIndex==1) {
         
         UITextField *textField=[alertView textFieldAtIndex:0];
         
         NSArray  *selectedRow=[ self .tableView indexPathsForSelectedRows];
         
         NSIndexPath  *indexPath=selectedRow[0];
         
         Dress *dress=dressList[indexPath.row];
         
         dress.dressDetial=textField.text;
         
         
         NSLog (@ "%@---%ld" ,textField.text,( long )indexPath.row);
         
         [ self .tableView reloadRowsAtIndexPaths:selectedRow withRowAnimation:UITableViewRowAnimationRight];
     
     }
}

 设置行高:

1
2
3
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:( NSIndexPath  *)indexPath{
     return  50;
}

关于UITable的优化:

1.最常用的就是不重复生成单元格,很常见,很实用;

2.使用不透明的视图可以提高渲染速度,xCode中默认TableCell的背景就是不透明的;

3.如果有必要减少视图中的条目,本文中设置textLabel,detialTextLabel,imageView,accessoryType;

4.更新条目的时候不要整体更新,更新选中的即可,建议reloadRowsAtIndexPaths,而不是使用reloadData;

 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4248066.html,如需转载请自行联系原作者

相关文章
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
141 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
3月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
3天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
22 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
143 66
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
87 11
|
2月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
173 3
|
2月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
3月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
3月前
|
传感器 iOS开发 UED
探索iOS生态系统:从App Store优化到用户体验提升
本文旨在深入探讨iOS生态系统的多个方面,特别是如何通过App Store优化(ASO)和改进用户体验来提升应用的市场表现。不同于常规摘要仅概述文章内容的方式,我们将直接进入主题,首先介绍ASO的重要性及其对开发者的意义;接着分析当前iOS平台上用户行为的变化趋势以及这些变化如何影响应用程序的设计思路;最后提出几点实用建议帮助开发者更好地适应市场环境,增强自身竞争力。
|
3月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!

热门文章

最新文章