UITableViewCell结合UIButton和可视化问题

时间:2013-04-17 21:15:24

标签: ios uitableview uibutton

我正在尝试在tableviewCells中创建一个星形按钮,这样用户就可以保存喜欢的项目。

到目前为止我已经尝试过了。

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

    static NSString *CellIdentifier = @"Cell";

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

    UIButton *CameraBreak=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    CameraBreak.frame=CGRectMake(260, 10, 60, 40);
    CameraBreak.tag=indexPath.row;
    [CameraBreak setImage:[UIImage imageNamed:@"first.png"] forState:UIControlStateNormal];

    [CameraBreak addTarget:self action:@selector(starClicked::) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.contentView addSubview:CameraBreak];  

    cell.textLabel.text = [titles objectAtIndex:indexPath.row];
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:15];   

    return cell;
}

问题是viewDidLoad上的按钮如下所示: VIEWDIDLOAD

但是一旦我把桌子弄得乱七八糟,按钮就会改变: ON SCROLL

有人知道这种行为的原因吗?我怎么解决这个问题?

更新

未选择: enter image description here

选择的: enter image description here

3 个答案:

答案 0 :(得分:1)

为什么不使用accessoryView类的UITableViewCell属性。

// create your button here...    
[cell setAccessoryView:cameraBreak]; // or cell.accessoryView = cameraBreak;

另外,将CameraBreak重命名为cameraBreak。您应该使用 camelCaseNotation

让我知道这是否有效。

修改

  

这种方式对以下想法也有用:if(附件   选中){show yellowstar.png} else(show graystar.png)

您可以更改imageView的{​​{1}}属性。

UITableViewCell

实现这一目标非常简单。关注how to set a tableview delegate。特别是你应该看看cell.imageView = // set the correct image 协议方法。

答案 1 :(得分:0)

更改UIButton类型Custom代替roundRect,每次重新加载表时都会添加按钮。因此,将所有这些代码添加到要分配单元格的大括号中,以便可以重用它们(不重复分配)。

替换此代码

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

}
UIButton *CameraBreak=[UIButton buttonWithType:UIButtonTypeRoundedRect];               
CameraBreak.frame=CGRectMake(260, 10, 60, 40);
CameraBreak.tag=indexPath.row;
[CameraBreak setImage:[UIImage imageNamed:@"first.png"] forState:UIControlStateNormal];

[CameraBreak addTarget:self action:@selector(starClicked::) forControlEvents:UIControlEventTouchUpInside]; 
[cell.contentView addSubview:CameraBreak];

作为

if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
UIButton *CameraBreak=[UIButton buttonWithType:UIButtonTypeCustom];        

CameraBreak.frame=CGRectMake(260, 10, 60, 40);
CameraBreak.tag=indexPath.row;
[CameraBreak setImage:[UIImage imageNamed:@"first.png"] forState:UIControlStateNormal];

[CameraBreak addTarget:self action:@selector(starClicked::)    forControlEvents:UIControlEventTouchUpInside]; 
[cell.contentView addSubview:CameraBreak];

}

它会正确显示。

希望它对你有所帮助。

答案 2 :(得分:0)

你看到的是许多按钮被添加到每个单元格的结果,一个在下一个单元格中。所有这些按钮创建代码都应该在cell == nil条件内发生。这样它只发生在新细胞上,而不是重复使用的细胞:

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


    UIButton *CameraBreak=[UIButton buttonWithType: UIButtonTypeCustom];
    CameraBreak.frame=CGRectMake(260, 10, 60, 40);
    CameraBreak.tag=indexPath.row;
    [CameraBreak setImage:[UIImage imageNamed:@"first.png"] forState:UIControlStateNormal];

    [CameraBreak addTarget:self action:@selector(starClicked:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.contentView addSubview:CameraBreak];
}

// configure the parts of the cell here that vary based on indexPath