iOS开发-UITableView表格优化

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

页面布局

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

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

@interface ViewController : UIViewController <UITableViewDataSource,UITableViewDelegate,UIAlertViewDelegate>
@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 *[email protected]"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;

时间: 2024-10-29 00:44:50

iOS开发-UITableView表格优化的相关文章

李洪强iOS开发之性能优化技巧

李洪强iOS开发之性能优化技巧 通过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化.结合本人在开发中遇到的问题,可以从以下几个方面进行性能优化. 一.view优化 1.不透明的View 设置为opaque. 2.根据实际情况重用.延迟加载或预加载View. 3.减少subviews数量,定制复杂cell使用drawRect.尽量使用drawRect而不是layoutSubView. 4.不直接调用drawRect. layoutSubviews方法.万不

iOS开发 UITableView的方法和属性总结

本文描述UITableView的各种方法,属性,委托以及数据源.本文的目的只是总结UITableView的用法,详细的例子另撰文描述. 1 数据源  UITableViewDataSource协议 01 返回组(节)的个数,默认是返回1,如果只有1组数据,可以不用实现该方法. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 02 返回某一组的行数,该组由section的值决定 - (NSInteger)table

IOS开发UITableView性能应用技巧TableViewCell的重用

?iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存.要解决该问题,需要重用UITableViewCell对象??重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用.当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象

iOS开发,UITableView相关问题

第一条:UITableViewCell 内容的设置 //文本放到最后 NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_dataArr.count - 1 inSection:0]; [_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; //刷新指定cell NSIndexP

iOS开发UITableView基本使用方法总结

本文为大家呈现了iOS开发中UITableView基本使用方法总结.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDataSource:然后 UITableView对象的 delegate要设置为 self:然后就可以实现这些delegate的一些方法拉. UITableView基本使用方法 1.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITable

iOS开发-UITableView自定义Cell

UITableView在iOS中开发的重要地位是毋庸置疑的,基本上应用中用到的比例是一半左右,而且大部分情况都是需要自定义单元格的,这样用户看到的App才能更有美感.之前写过UITableView的基本用法,如果对UITableView不是很熟悉可以参考本人之前的博客,因此很多UITableView的知识点就默认你已经熟悉了,先看下自定义实现的效果,这是自定义的Cell最后展现的效果: 自定义Cell 1.首先新建一个CustomCell.xib文件,方式如下: 2.新建一个继承自UITable

iOS开发-UITableView常用方法

UITableView常用来展示数据,类似于Android中的ListView,相对于Android中的ListView而言,UITableView的实现是非常简单,继承UITableViewDataSource, UITableViewDelegate然后根据需要是实现对应的方法即可. UITableView有两个默认的内置风格,Plain和Grouped,Plain表明表格视图自身没有真正地在你自己实际地提供任何外观之前提供很多的外观,大部分情况下,它会做的唯一的事情是它会给你这些heade

iOS开发之性能优化

1.避免过于庞大的XIB 当加载XIB的时候把所有的东西都放在了内存里,包括任何的图片:如果有一个不会即刻用到的view,就会浪费宝贵的内存资源了. 当加载一个引用了图片或者声音资源的nib时,nib加载代码会把图片和声音文件写进内存. 2.不要阻塞主线程 UIKit在主线程上的所有工作,渲染,管理触摸,回应输入等都需要在上面完成. 将耗时操作放在子线程中. 3.在imageViews中调整图片的大小 如果要在UIImageView中显示一个来自bundle的图片,你就应该保证图片的大小和UII

iOS开发UITableView的动画cell

1.动画cell 针对cell的动画,在Delegate中对cell的layer进行操作: 2.实现代码 #import "ViewController.h" #import "TableViewCell.h" #define CScreenWidth [[UIScreen mainScreen] bounds].size.width #define CScreenHeight [[UIScreen mainScreen] bounds].size.height @