首页 > 代码库 > UITableView (1)

UITableView (1)

1.实例化 Table View 并设置一个Delegate

2.向TableView填充数据

- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    self.view.backgroundColor = [UIColor whiteColor];    _myTableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];        _myTableView.delegate = self;    _myTableView.dataSource = self;    /*Make sure our tableview resizes correctly*/    _myTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;    [self.view addSubview:_myTableView];}

一个TableView的数据源能够实现三个重要方法,其中2个必须实现

@required

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

首先告诉TableView显示3个section:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{    NSInteger result = 0;    if ([tableView isEqual:_myTableView]) {        result = 3;    }    return result;}

然后告诉每个Section显示多少行:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    NSInteger result = 0;    if ([tableView isEqual:_myTableView]) {        switch (section) {            case 0:                result = 3;                break;            case 1:                result = 5;                break;            case 2:                result = 8;                break;            default:                break;        }    }    return result;}

最后返回TableViewCell的静态实例给表示图:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    UITableViewCell *result = nil;    if ([tableView isEqual:_myTableView]) {        static NSString *TableViewCellIdentifier = @"MyCells";        result = [tableView dequeueReusableCellWithIdentifier:TableViewCellIdentifier];        if (result == nil) {            result = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TableViewCellIdentifier];        }        result.textLabel.text = [NSString stringWithFormat:@"Section%ld,Cell%ld",indexPath.section,indexPath.row];    }    return result;}

3.接收和处理TableView事件,例如

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{    if ([tableView isEqual:_myTableView]) {        NSLog(@"%@",[NSString stringWithFormat:@"Cell %ld in Section %ld is selected",indexPath.row,indexPath.section]);    }}

4.在TableView中使用不同种类的附件

(通过展示不同附件(accessories),你想抓住用户对一个tableview的关注,或者提供不同的方式使用户在tableview中和每个cells进行互动)

每个cell的accessoryType属性是UITableViewCellAccessoryType枚举类型的:

typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) {

    UITableViewCellAccessoryNone,                   // don‘t show any accessory view

    UITableViewCellAccessoryDisclosureIndicator,    // regular chevron. doesn‘t track

    UITableViewCellAccessoryDetailDisclosureButton, // info button w/ chevron. tracks

    UITableViewCellAccessoryCheckmark,              // checkmark. doesn‘t track

    UITableViewCellAccessoryDetailButton NS_ENUM_AVAILABLE_IOS(7_0) // info button. tracks

};

注意:UITableViewCellAccessoryDetailDisclosureButton的按钮在被点击时会向委托触发一个事件.因此,detail disclosure按钮允许用户在同一行上执行两个独立相关的操作.此按钮点击时会产生一个被tableview的委托对象捕获的事件:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{     NSLog(@"Accessory button is tapped for cell at index path = %@", indexPath);    UITableViewCell *ownerCell = [tableView cellForRowAtIndexPath:indexPath];    NSLog(@"Cell Title = %@", ownerCell.textLabel.text);}

4.创建自定义TableView单元格附件

方案:把类型UIView的一个实例分配到任何UITableViewCell类的实例的accessoryView 的属性:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    UITableViewCell* result = nil;    static NSString *MyCellIdentifier = @"SimpleCell";    result = [tableView dequeueReusableCellWithIdentifier:MyCellIdentifier];    if(result == nil){        result = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyCellIdentifier];    }    result.textLabel.text = [NSString stringWithFormat:@"Section %ld, Cell %ld", (long)indexPath.section,(long)indexPath.row];    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];    button.frame = CGRectMake(0.0f, 0.0f, 150.0f, 25.0f);    [button setTitle:@"Expand" forState:UIControlStateNormal];    [button addTarget:self               action:@selector(performExpand:)     forControlEvents:UIControlEventTouchUpInside];    result.accessoryView = button;    return result;}

那么点击按钮事件发送的按钮属于哪一个单元格呢?所以,我很要以某种方式把我们的按钮与其所属的cell连接起来

- (void)performExpand:(UIButton *)paramSender{    UITableViewCell *ownerCell = (UITableViewCell *)[paramSender superview];    if (ownerCell != nil) {        NSIndexPath *ownerCellIndexPath = [_myTableView indexPathForCell:ownerCell];        if (ownerCellIndexPath.section == 0&& ownerCellIndexPath.row == 1) {            //do something        }    }}

5.在tableView中展示分层数据

方案:使用TableViewCell的缩进功能:

//使用tableViewcell的缩进功能 有两个相关属相:缩进等级和缩进宽度,两者相乘就是偏移量,根据这个偏移量cell的内容会向左右两侧偏移,正数向右,负数向左        UITableViewCell *result = nil;
.....
     result.indentationLevel = indexPath.row;        result.indentationWidth = 10.0f;

 

UITableView (1)