博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发-UITableView表格优化
阅读量:5994 次
发布时间:2019-06-20

本文共 4466 字,大约阅读时间需要 14 分钟。

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

页面布局

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

 

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

@interface ViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UITableView *tableView;@end

服装类的定义:

@interface Dress : NSObject@property (strong,nonatomic) NSString *dressName;@property (strong,nonatomic) NSString *dressDetial;@property (strong,nonatomic) NSString  *dressImage;@end

优化与实现  

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

定义存储数据的数组:

 

@interface ViewController (){    NSArray *imageArr;    NSArray *dressArr;    NSMutableArray *dressList;}@end

 

初始化数据:

- (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];    }}

 设置行数:

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

 设置分组:

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

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

- (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;}

选中行之后的弹框设置:

- (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中的点击事件:

- (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];        }}

 设置行高:

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

关于UITable的优化:

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

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

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

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

 

转载于:https://www.cnblogs.com/xiaofeixiang/p/4248066.html

你可能感兴趣的文章
Ubuntu 14.04 64位字体美化(使用黑文泉驿)
查看>>
[android] AndroidManifest.xml - 【 manifest -> permission】
查看>>
20150728月度会议
查看>>
explain mysql性能优化
查看>>
NoSql---MongoDB基本操作
查看>>
【移动开发】WIFI热点通信(二)
查看>>
C#多线程编程实例 螺纹与窗口交互
查看>>
ByteBuffer用法小结
查看>>
使用linux mysql客户端建立表时遇到格式解析的问题
查看>>
find the mincost route(最小环,最短路,floyd)
查看>>
什么是自主开发项目的限度就是猿?
查看>>
TCP 的那些事儿(上)
查看>>
Discuz!NT3.6与网站整合(操作用户信息)解决方案
查看>>
【今日推荐】10大流行的 Metro UI 风格的 Bootstrap 主题和模板
查看>>
Swift - 实现拨打电话
查看>>
在线代码编辑、保存与运行网址推荐
查看>>
博客园添加访问人数统计
查看>>
Yii2 RBAC 用到的表
查看>>
在使用DBMS_LOB.WRITEAPPEND()追加Clob内容的时候,报数字或值异常
查看>>
【总结】编写自己的JDBC框架
查看>>