15 May 2015

创建自定义TableView单元格附件


问题


iOS SDK提供的附件不满意,想要创建自己的附件。

方案


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

- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath {
    UITableViewCell result = nil;

if ([tableView isEqual:self.myTableView]) {
    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;

}

这段代码使用performExpand:方法叙谈每个按键的选择器。下面是这个方法的定义:

- (void)performExpand:(id)paramSender {
    NSLog(@"id = %@", paramSender);
}

TableView-4

图4-4. 带有自定义附件视图的TableView单元格

讨论


UITableViewCell类型对象保留一个名为accessoryView属性。

如果对内置iOS SDK TableViewCell的附件不完全满意的话,可以把别的视图赋予这个属性。属性设置之后,Cocoa Touch将忽略accessoryType属性的值,同时把分配到accessoryView属性的值作为分配的附件用到单元格中。

当点击任何单元的按钮,performExpand:方法就会被调用。如何决定发送按钮属于哪一个单元格?现在,我们要以某种方式把我们的与其所属的cell连接起来。

处理这个问题的一个办法是检索触发事件的按钮的superView。TableViewCell的辅助视图作为他们的子视图添加到cell的配件视图,因为检索按钮的superView将返回TableViewCell,返回的这个拥有配套的视图按钮的cell:

- (void)performExpand:(UIButton )paramSender {
    UITableViewCell ownerCell = (UITableViewCell *)paramSender.superview;

if (ownerCell != nil) {
    NSIndexPath *ownerCellIndexPath = [self.myTableView indexPathForCell:ownerCell];
    NSLog(@"Accessory in index path is tapped. Index path = %@", ownerCellIndexPath);

    if (ownerCellIndexPath.section == 0 && ownerCellIndexPath.row == 1) {
        /* This is the second row in the first section */

    }
}

}



blog comments powered by Disqus