我的App中有自定义单元格的tableview,每个单元格包含两个复选框按钮。
问题是,当触发(向上或向下)滚动事件时,它正在重新加载tableview。因此,复选框按钮变为初始状态。
请给我一个解决方案。
谢谢你
答案 0 :(得分:1)
您必须自己维护一个列表,以确定应该检查哪些单元格。请记住,在tableView:cellForRowAtIndexPath:
中,正确的实现将循环使用单元格,以便您永远不会实例化超过10-15个单元格。如果您没有正确处理它,这可能会导致一些时髦的结果。当我完成一个糟糕的实现时,我已经看到某些单元属性从一个单元格“延续”到下一个单元格。
无论如何,这是我推荐的(基于我认为你的要求):
1.创建一个类来支持每个UITableViewCell
2.在该类中创建一个属性,以确定应检查两个复选框中的哪一个(或两者都不)。
3.在ViewController / TableViewController中,维护一个NSMutableArray / NSArray,其中数组中的1个项目= UITableView中的1个单元格。
4.在tableView:cellForRowAtIndexPath:
方法中,获取对数组中相应项的引用。
5.然后,检查该实例的属性并适当设置复选框值。
TableView.h
@interface TableView : UITableViewController
@property (strong, nonatomic) NSMutableArray *itemArray;
@end
TableView.m
@implementation TableView
@synthesize itemArray;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Assume you get a valid, custom UITableViewCell at this point (named "cell")
// Configure the cell...
NSObject *classItem = [[self itemArray] objectAtIndex:[indexPath row]];
[[cell checkBox1] setChecked:[classItem checkbox1Checked]];
[[cell checkBox2] setChecked:[classItem checkbox2Checked]];
return cell;
}
@end
答案 1 :(得分:0)
那么你不应该使用TableView作为数据源。
每次进入单元格时,都会要求UITableViewDataSource将UITableViewCell作为索引路径。
- (void) tableView:(UITableView *)tableView setImage:(UIImage *)image forCellAtIndexPath:(NSIndexPath *)indexPath
在is方法中,您应该设置复选框状态,因为它反映在您的dataSource中。 当复选框被更改时,将其保存在具有所选状态的数据源中。
示例:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"CheckedTableViewCell";
CheckedTableViewCell *cell = (CheckedTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
[[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil];
cell = (CheckedTableViewCell *)self.nibCell;
self.nibCell = nil;
}
item *item = [self objectAtIndexPath:indexPath];
cell.titleLabel.text = item.title;
cell.switch.on = item.selected;
return cell;
}
答案 2 :(得分:0)
单击它时,可以在NSUserDefaults中保存状态。只需添加@selector(changedOne: )
的目标并添加void语句:
- (void)changedOne: (id)sender {
NSUserDefaults *df = [NSUserDefaults standardUserDefaults];
NSString *row = [NSString initWithFormat:@"toggleOneRow%i",indexPath.row];
if (sender.on) {
[df setBool:YES forKey:row];
}
else {
[df setBool:NO forKey:row];
}
}
答案 3 :(得分:0)
您使用的是cellForRowAtIndexPath
吗?如果是,那么而不是
static NSString CellIdentifier=@"CellIdentifier"
使用
NSString *CellIdentifier=[NSString stringWithFormat=@"CellIdentifier%d",indexPath.row];
您可以采取的其他方法是将标签分配给复选框按钮,并在appDelegate文件中设置一个字典,并为复选框标记设置值。最初可以设置为已选中或未选中。并在cellforrowatindexpath方法中设置值。根据appdelegate字典设置复选框的值。当用户选择或取消选择按钮时,更新appdelegate字典中的状态。
答案 4 :(得分:0)
您应该在数据源中设置按钮的状态,并在创建单元格时加载此状态。我写了small Xcode project来证明这一点。