0

我正在尝试在我的 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 上的按钮如下所示: 查看DIDLOAD

但是,一旦我浏览表格,它的按钮就会改变如下: 滚动

有人知道这种行为的原因吗?我该如何解决这个问题?

更新

未选中的: 在此处输入图像描述

已选择: 在此处输入图像描述

4

3 回答 3

1

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

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

另外,重命名CameraBreakcameraBreak. 您应该使用camelCaseNotation

让我知道这个是否奏效。

编辑

这种方式对以下想法是否也有用: if (Accessory selected) {show yellowstar.png } else (show graystar.png)

您可以更改 的imageView属性UITableViewCell

cell.imageView = // set the correct image

实现这一点非常简单。按照如何设置 tableview 委托。特别是你应该看看- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;协议方法。

于 2013-04-17T22:08:29.277 回答
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
于 2013-04-17T21:29:10.427 回答
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];

}

它会正确显示。

希望它可以帮助你。

于 2013-04-17T21:25:18.750 回答