我在UIButton
中选择UITableViewCell
并保持选中状态,我已为UIButton
的每个状态添加了一个图像(通过Interface Builder
,而不是以编程方式)。但是当我滚动时,所选状态显示重复。我已经阅读了很多类似信息的帖子,但无法找到问题的解决方案。我注意到tableView
正在使用UIButton
的状态重用缓存中的单元格。
这是我的代码。
在我的Custom Cell
:
- (IBAction)highlightStar:(UIButton *)sender {
self.starButton.selected=!sender.selected;
}
在我的控制器viewDidLoad
中:
UINib *nib = [UINib nibWithNibName:@"CellS"
bundle:nil];
[self.tableView registerNib:nib
forCellReuseIdentifier:CellIdentifier];
在我的控制器cellForRowAtIndexPath
中:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CellS *cell = (CellS *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.backgroundColor = [UIColor clearColor];
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
NSDictionary *dict=self.items[indexPath.row];
NSString *header=[dict objectForKey:@"header"];
[cell.labelReader setText:header];
return cell;
}
捕获1(不使用滚动)。选择了两个UIButton:
捕获2(使用滚动)。选择了两个重复的UIButton:
由于
答案 0 :(得分:0)
由于单元格在滚动过程中被重复使用,因此您需要在从cellForRowAtIndexPath
答案 1 :(得分:0)
在Custom Cell
课程中,添加以下内容:
- (void)prepareForReuse
{
self.starButton.selected= NO;
}
同样在你的cellForRowAtIndexPath中,你应该更新starButton状态:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
SBQCell *cell = (SBQCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.backgroundColor = [UIColor clearColor];
[tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
NSDictionary *dict=self.items[indexPath.row];
NSString *header=[dict objectForKey:@"header"];
[cell.labelReader setText:header];
// HERE - Update cell's starButton state according to your current data info
cell.starButton.selected = [dict objectForKey:@"selectedState"];
// Keep track of indexPath.row and add target
cell.starButton.tag = indexPath.row;
[cell.starButton addTarget:self action:@selector(didTapStarButton:) forControlEvents:UIControlEventTouchUpInside];
return cell;
}
应该这样做。
编辑:我添加了一种方法来跟踪你的starButton在cellForRowAtIndexPath中的状态。您需要在viewController中添加以下内容:
- (void)didTapStarButton:(UIButton *)button
{
button.selected = !button.selected;
// Here, keep track of the change in state with button.tag that is equal to the cell's indexPath.row
}
您可以删除自定义单元格中更改starButton状态的代码,因为您现在可以在此处执行此操作。
答案 2 :(得分:0)
我找到了解决方案!更改了我的模型,每次更改收藏状态时,我都会更改模型,并从模型中更新单元格。
在cellForRotAtIndexPath
:
Model *new=nil;
//I parse the plist, and fill an array with Model Objects, where each Object is an item from the Plist. The method newsAtIndex returns the Model Object for the selected index
new=[self.model newsAtIndex:indexPath.row];
cell.labelReader.text=new.header;
[cell.starButton addTarget:self action:@selector(didTapStarButton:) forControlEvents:UIControlEventTouchUpInside];
cell.starButton.tag = indexPath.row;
cell.starButton.selected=new.Favorite;
在didTapStarButton
:
Model *new=nil;
new=[self.model newsAtIndex:button.tag];
new.Favorite=button.selected;