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,如需转载请自行联系原作者

相关文章
|
9天前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
6天前
|
前端开发 iOS开发 开发者
探索iOS开发中的SwiftUI框架
【9月更文挑战第21天】在iOS应用开发的广阔天地中,SwiftUI框架如一股清新之风,为开发者带来了声明式语法的便捷与高效。本文将深入探讨SwiftUI的核心概念、布局方式及数据绑定机制,同时通过实例演示如何运用SwiftUI构建用户界面,旨在引领读者领略SwiftUI的魅力,并激发其对iOS开发新趋势的思考与实践。
21 6
|
6天前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
22 4
|
17天前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
15天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
17天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
40 5
|
17天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术与科学
在移动应用开发的广阔天地中,安卓与iOS两大平台如同东西方哲学的碰撞,既有共通之处又各具特色。本文将深入探讨这两个平台的设计理念、开发工具和市场定位,旨在为开发者提供一份简明扼要的指南,帮助他们在这场技术与商业的博弈中找到自己的道路。通过比较分析,我们将揭示每个平台的优势与局限,以及它们如何影响应用的性能、用户体验和市场接受度。无论你是初涉江湖的新手,还是经验丰富的老手,这篇文章都将为你的选择提供新的视角和思考。
30 5
|
17天前
|
开发工具 Android开发 Swift
探索安卓与iOS开发的差异:从新手到专家的旅程
在数字时代的浪潮中,移动应用开发已成为连接世界的桥梁。本文将深入探讨安卓与iOS这两大主流平台的开发差异,带领读者从零基础出发,逐步了解各自的特点、开发环境、编程语言及市场策略。无论你是梦想成为移动应用开发者的初学者,还是希望扩展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议。
|
18天前
|
人工智能 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术
在移动应用开发的广阔天地里,安卓和iOS两大操作系统各占半壁江山。本文将深入探讨这两个平台的开发环境、工具及市场趋势,帮助开发者在选择适合自己项目的平台时做出更明智的决策。通过比较各自的优势与局限,我们不仅能更好地理解每个系统的核心特性,还能洞察未来技术发展的脉络。无论你是刚入行的新手还是资深开发者,这篇文章都将为你提供有价值的参考和启示。
33 5
|
18天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:一场操作系统的较量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同海上的两艘巨轮,各自承载着不同的使命与梦想。本文将深入浅出地探讨这两个系统在开发领域的异同,从用户体验、开发工具、市场趋势等多个维度进行比较分析。通过这场技术的较量,我们可以更好地理解每个系统的优势与局限,以及它们如何影响我们的日常生活和工作。