我创建了三个按钮,并为正常状态和所选状态设置背景图像。单击按钮时,将一个图像更改为选定状态。但是当滚动表视图时,不保留所选图像(先前选择的单元格),这意味着它是正常状态。
我的代码是,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *likeSelectedImage = [UIImage imageNamed:@"like.png"];
//set image as background for button in the normal state
[likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];
[likeBtn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:likeBtn];
}
我的按钮操作是,
-(void) likeAction : (id) sender
{
UIImage *likeSelectedImg = [UIImage imageNamed:@"like-selected.png"];
UIImage *likeImg = [UIImage imageNamed:@"like.png"];
if ([sender isSelected]) {
[sender setImage:likeImg forState:UIControlStateNormal];
[sender setSelected:NO];
}else {
[sender setImage:likeSelectedImg forState:UIControlStateSelected];
[sender setSelected:YES];
}
}
我的问题是,当我滚动表视图单元格时,不保留先前选择的图像状态。因为cellForRowAtIndex方法已经反复调用,当我滚动表时。所以它会自动设置"[likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];"
。如何避免这个问题?
那么请帮帮我吧?
谢谢!
答案 0 :(得分:5)
由于UITableView用于显示数据的设计模式,您看到了这一点。为了最大限度地减少资源使用,只保证当前屏幕上的表格单元格保留在内存中。当单元格在屏幕外滚动时,单元格对象将被回收用于新单元格出现在列表的另一端,从而失去其状态。
我假设您在tableView: cellForRowAtIndexPath:
中返回一个单元格时已经修剪了一些代码,但在您发布的代码段中没有任何其他地方引用该变量。这使得在添加按钮之前无法看到你如何获得单元格。
关于你的代码如何工作的黑暗中的一点点,但这里是你需要做什么来保持状态的高级概述。
likeAction
中确定按钮所在的行(可能在创建时将行号分配给按钮的标记属性)并更新NSArray中相应行的状态tableView: cellForRowAtIndexPath:
中,使用从NSArray为给定indexPath提取的状态,使用正确的图像设置按钮。答案 1 :(得分:1)
上面的语法不正确:
cell = [[[ToDoSummaryTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
给每个单元格一个唯一的标识符,它应该可以工作。
请参阅在XCode IOS api中使用'reuseidentifier'的任何示例代码。
谢谢, 巴拉斯
答案 2 :(得分:0)
您可以为具有标识符的每个单元格使用'reuseIdentifier'。
cell = [[[ToDoSummaryTableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault reuseIdentifier:.<identifier>] autorelease];
答案 3 :(得分:0)
我重新编辑您的上述代码。我希望,我会帮助你。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *likeSelectedImage = [UIImage imageNamed:@"like.png"];
//set image as background for button in the normal state
[likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];
[likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateHighlighted];
[likeBtn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:likeBtn];
}