• UITableView 总结


    UITableView:
    
    1、重用代理
     @interface ViewController : UIViewController<UITableViewDelegate,UITableViewDataSource>
    2、定义
        _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)     style:UITableViewStylePlain];
        _tableView.delegate = self; //代理
        _tableView.dataSource = self;
        [self.view addSubview:_tableView];
        [_tableView release];
     //分割线颜色
        _tableView.separatorColor = [UIColor redColor];
        //分割线类型
        //_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        //行高
        _tableView.rowHeight = 100;
        //背景颜色
        _tableView.backgroundColor = [UIColor orangeColor];
        //_tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"2_4.jpg"]];
        //背景图片
        UIImageView* imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
        imageView.image = [UIImage imageNamed:@"2_4.jpg"];
        _tableView.backgroundView = imageView;
        [imageView release];
    
    3、设置组的行数
    想要确定哪一组,则要根据section的值来判断
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return _dataArray.count;
    }
    4、设置组数
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 2;
    }
    5、创建行代理
    ********************
    判定组用:indexPath.section
    判定行:indexPath.row
    ********************
    
    
    
    - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:indexPath.row%2==0 ? @"ID1" : @"ID2"];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:indexPath.row%2==0 ? @"ID1" : @"ID2"] autorelease];
            if (indexPath.row%2==0) {
                cell.contentView.backgroundColor = [UIColor redColor];
            } else {
                cell.contentView.backgroundColor = [UIColor blueColor];
            }
        }
        //cell选中效果
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        
        
        cell.textLabel.text = [_dataArray objectAtIndex:indexPath.row];
        NSLog(@"%d",indexPath.row);
        cell.textLabel.textColor = [UIColor whiteColor];
       
        
        return cell;
    }
    
    6//组标题 头部
    - (NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
        return [NSString stringWithFormat:@"%d",section];
    }
    
    //组标题 尾部
    - (NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
        return @"end";
    }
    
    //行高
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    //    indexPath.section
    //    indexPath.row
        if (indexPath.section == 0) {
            return 50;
        }
        return 80;
    }
    
    //每一组头部的高度
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
        return 20;
    }
    
    6、设置选中状态 的闪现: [cell setSelected:NO animated:NO];
    
    //选中时 调用的方法
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = (UITableViewCell *)[tableView viewWithTag:indexPath.section *10 + indexPath.row+1];
      //  NSLog(@"%@",cell.textLabel.text);
        cell.textLabel.textColor = [UIColor blueColor];
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [cell setSelected:NO animated:NO];
    }
    //撤销选中时,调用的方法,可用于取消 accessoryType的状态,文字的颜色改变等
    - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = (UITableViewCell *)[tableView viewWithTag:indexPath.section *10 + indexPath.row+1];
        cell.textLabel.textColor = [UIColor blackColor];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    
    7//加组索引,只有超过一行的时候才能发挥作用
    - (NSArray*)sectionIndexTitlesForTableView:(UITableView *)tableView{
        return [NSArray arrayWithObjects:@"A", @"B" , @"C", @"D", nil];
    }
    
    
    8、 编辑
    
    //编辑按钮的事件设置
    - (void)edit{
        
        [_delArray removeAllObjects];
        if (_tableView.editing) {
            [_tableView setEditing:NO animated:YES];
        } else {
            [_tableView setEditing:YES animated:YES];
        }
    }
    //删除按钮的事件
    - (void)delButtonClick
    {
        NSMutableIndexSet *index = [NSMutableIndexSet indexSet];
        for (NSIndexPath* indexPath in _delArray) {
            [index addIndex:indexPath.row];
        }
        [_dateArray removeObjectsAtIndexes:index];
        [_tableView deleteRowsAtIndexPaths:_delArray withRowAnimation:UITableViewRowAnimationAutomatic];
        [_delArray removeAllObjects];
    }
    //允许编辑
    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
        return YES;
    }
    //指定编辑模式,插入,删除
    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
        //单插入
        //return UITableViewCellEditingStyleInsert ;
        //多选删除
        return UITableViewCellEditingStyleInsert | UITableViewCellEditingStyleDelete;
    }
    //触发编辑方法;根据editingStyle来判断时那种类型
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
        //删除
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            //先从数组删除
            [_dateArray removeObjectAtIndex:indexPath.row];
            //再从表格删除
            //删除行,可以单行,也可以多行
            [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
        }
        
        if (editingStyle == UITableViewCellEditingStyleInsert) {
            //先插入数组
            [_tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
            
        }
    }
    //更改删除按钮上的文本
    - (NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
        return @"删掉我吧";
    }
    //编辑时 数据数组的处理
    //多选删除 选中
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (tableView.editing) {
            [_delArray addObject:indexPath];
        }
    }
    //取消选中
    - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (tableView.editing) {
            [_delArray removeObject:indexPath];
        } 
    }
    
    9、在AppDelegate.m里面添加UINavigationController,视图控制
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        // Override point for customization after application launch.
        self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
        UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:self.viewController];
        self.window.rootViewController = nc;
        [self.window makeKeyAndVisible];
        return YES;
    }
    
    10、Cell的三种创建方法
    
    方法1:自己创建 继承UITableViewCell 的类
    #import <UIKit/UIKit.h>
    @interface UserCell : UITableViewCell
    @property (nonatomic, retain) UILabel* userLabel;
    @property (nonatomic, retain) UIImageView* userView;
    @end
    
    .m文件
    #import "UserCell.h"
    
    @implementation UserCell
    
    - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {
            [self makeView];
        }
        return self;
    }
    //自建View
    - (void)makeView{
        //60
        self.userView = [[[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 50, 50)] retain];
        [self.contentView addSubview:self.userView];
        [self.userView release];
        
        self.userLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 10, 200, 20)];
        [self.contentView addSubview:self.userLabel];
        [self.userLabel release];
    }
    //由于上面property中写了retain,这里需要再次释放,
    - (void)dealloc{
    //    [self.userView release];
    //    [self.userLabel release];
        self.userLabel = nil;
        self.userView = nil;
        [super dealloc];
    }
    @end
    
    方法二:用XIB创建
    
    1.创建的时候Class的名字写和。h文件一样的名字
    2.Table View Cell里面的Identifiel属性 设置成ID,和.m文件的索引字符串一样
    3.在XIB里面只能创建一个CELL,不能由其他孤立的控件,删除的时候要用 delete键删除,不然不够干净
    4.设置 控件的Tag值
    5.在.m文件里面
    - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"ID"];
        if (cell == nil) {
            cell = [[[NSBundle mainBundle] loadNibNamed:@"UserCell" owner:self options:nil] lastObject];
        }
        
        UILabel* label = (UILabel*)[cell viewWithTag:20];
        UIImageView* imageView = (UIImageView*)[cell viewWithTag:10];
        
        label.text = [_dataArray objectAtIndex:indexPath.row];
        imageView.image = [UIImage imageNamed:@"1.png"];
        
        return cell;
    }
    
    方法三:UserCell 和XIB象结合
    
    1.修改UserCell.h文件
    #import <UIKit/UIKit.h>
    @interface UserCell : UITableViewCell
    @property (nonatomic, retain) IBOutlet UILabel* userLabel;
    @property (nonatomic, retain) IBOutlet UIImageView* userView;
    @end
    2.在XIB里面 建立空间的索引:按 右键,拖拉线
    3..m文件
    - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        UserCell* cell = [tableView dequeueReusableCellWithIdentifier:@"ID"];
        if (cell == nil) {
            cell = [[[NSBundle mainBundle] loadNibNamed:@"UserCell" owner:self options:nil] lastObject];
        }
        
        cell.userLabel.text = [_dataArray objectAtIndex:indexPath.row];
        cell.userView.image = [UIImage imageNamed:@"1.png"];
        
        return cell;
    }
    
    11、 设置行高
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 60;`
    }
    行高自适应:
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        // 列寬
        CGFloat contentWidth = self.tableView.frame.size.width;
        // 用何種字體進行顯示
        UIFont *font = [UIFont systemFontOfSize:13];
        // 該行要顯示的內容
        NSString *content = [data objectAtIndex:indexPath.row];
        // 計算出顯示完內容需要的最小尺寸
        CGSize size = [content sizeWithFont:font constrainedToSize:CGSizeMake(contentWidth, 1000) lineBreakMode:UILineBreakModeWordWrap];
            // 這裏返回需要的高度
        return size.height;
    }
    //contentWidth一般可以直接设置成屏幕宽度,或者一个定值,这样就简单了
    //系统是先把全部的行高设置完后,才会进行cell的内容设置,所以在设置行高的时候时无法获取cell的
    
    // Customize the appearance of table view cells.
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *CellIdentifier = @"Cell";
        // 列寬
        CGFloat contentWidth = self.tableView.frame.size.width;
        // 用何種字體進行顯示
        UIFont *font = [UIFont systemFontOfSize:13];    
        // 該行要顯示的內容
        NSString *content = [data objectAtIndex:indexPath.row];
        // 計算出顯示完內容需要的最小尺寸
        CGSize size = [content sizeWithFont:font constrainedToSize:CGSizeMake(contentWidth, 1000) lineBreakMode:UILineBreakModeWordWrap];
        // 構建顯示行
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        }
        CGRect rect = [cell.textLabel textRectForBounds:cell.textLabel.frame limitedToNumberOfLines:0];
        // 設置顯示榘形大小
        rect.size = size;
        // 重置列文本區域
        cell.textLabel.frame = rect; 
        cell.textLabel.text = content;
        // 設置自動換行(重要)
        cell.textLabel.numberOfLines = 0;
        // 設置顯示字體(一定要和之前計算時使用字體一至)
        cell.textLabel.font = font; 
        return cell;
    }
    
    12、获取cell的方法
     NSIndexPath *indexPath2 = [NSIndexPath indexPathForItem:indexPath.row inSection:0];
    BookCell *cell = (BookCell *)[_tableView  cellForRowAtIndexPath:indexPath2]
  • 相关阅读:
    python基础之字符串和字节的转换
    python学习笔记(三)字符串方法、读写文件、json处理以及函数
    python学习笔记(二):list,字典,字符串,元组,文件
    python学习笔记(一):python入门
    接口测试:jmeter学习笔记:数据库操作和压测
    接口测试:postman和jmeter随记
    设计模式之建造者模式
    设计模式之外观模式
    设计模式之模板模式
    设计模式之原型模式
  • 原文地址:https://www.cnblogs.com/zibuyu/p/3564424.html
Copyright © 2020-2023  润新知