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]

 

posted @ 2014-02-24 12:55  煮人为乐  阅读(4850)  评论(0编辑  收藏  举报