装饰动态形成的表格视图单元格:将UIButton添加到contentView或accessoryView

时间:2013-11-26 13:12:14

标签: ios objective-c uitableview uibutton

我想装饰tableViewCells并向某个单元格的内容视图添加一个按钮。 我希望下面的这段代码能够做到这一点。但是,我无法在contentView或accessoryView上观察该按钮。

我的调试过程中的另一个问题是,当我使用以下行打印tableViewCells的x和y位置时:NSLog(@"Cell frame origin x: %f y: %f", cell.frame.origin.x, cell.frame.origin.y);我得到输出:

origin x: 0.000000 y: 0.000000 
origin x: 0.000000 y: 0.000000 
origin x: 0.000000 y: 0.000000

请注意,destinationName数组有三个项目。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // define the cell identifier
    static NSString *cellIdentifier = @"SettingsCell";
    // get the cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    // set the content of each cell
    NSString *route = [destinationName objectAtIndex:indexPath.row];
    [cell.textLabel setText:route];
    [cell.detailTextLabel setText:[originName objectAtIndex:indexPath.row]];

    //define a button
    UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
    [btn setFrame:CGRectMake(cell.frame.origin.x + 100 ,
                             cell.frame.origin.y + 5,
                             40, 30)];
    NSLog(@"Cell frame origin x: %f y: %f", cell.frame.origin.x, cell.frame.origin.y);
    //Output for this code is: origin x: 0.000000 y: 0.000000
    [btn setTag:indexPath.row];
    [btn setTitle:@"Btn" forState:UIControlStateNormal];

    // Add this button to the contentView of the cell
    [cell.contentView addSubview:btn];
    //[cell.accessoryView addSubview:btn];

    return cell;
}

如何成功将按钮放在tableViewCell的contentView上?

3 个答案:

答案 0 :(得分:0)

Apple为其库创建了很好的文档。

您应该先阅读它:Table View Programming Guide

然后尝试他们的例子:iPhoneCoreDataRecipes

答案 1 :(得分:0)

我从blog post解决了我的问题。

答案 2 :(得分:-1)

第一件事:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

在第一次运行中,当没有单元格出队时 - 返回“nil”。 你必须处理它并创建新的单元格。

if(cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

第二件事是 - 如果单元格将被出列(如果您在可见范围之外滚动表视图并返回) - 您的代码将始终添加一个子视图 - 多次到同一个重用的单元格。更好的方法是在初始化时创建自定义类并添加子视图。如果你想要快捷方式 - 在上面的代码块中执行if if(cell === nil) - 当你创建新实例时。

在该函数中你刚刚创建了一个单元格 - 它将返回到tableview,它要求它 - 只是你可以尝试跟踪x,y坐标。

以上所有内容都包含在该代码中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// define the cell identifier
static NSString *cellIdentifier = @"SettingsCell";
// get the cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if(cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

//define a button
    UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
    [btn setFrame:CGRectMake(100,5, 40, 30)]; //coordinates are x,y inside cell - top-left is 0,0
    //Output for this code is: origin x: 0.000000 y: 0.000000
    [btn setTag:indexPath.row];
    [btn setTitle:@"Btn" forState:UIControlStateNormal];

    // Add this button to the contentView of the cell
    [cell.contentView addSubview:btn];
}

// set the content of each cell
NSString *route = [destinationName objectAtIndex:indexPath.row];
[cell.textLabel setText:route];
[cell.detailTextLabel setText:[originName objectAtIndex:indexPath.row]];

return cell;
}