我长期以来一直在寻找这个,但没有得到任何明确的答案。
我的表格视图单元格中有一个UISwitch
作为accessoryView
。问题是每次我滚动表时,交换机都会重置回原来的状态。
这是我的cellForRowAtIndexPath
方法:
-(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];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
switch1 = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
[switch1 addTarget:self action:@selector(buttonPressed :) forControlEvents:UIControlEventValueChanged];
[switch1 setOn:YES animated:NO];
cell.accessoryView = switch1;
NSString *iconsImage = [[self iconsImages] objectAtIndex:[indexPath row]];
UIImage *cellIcon = [UIImage imageNamed:iconsImage];
[[cell imageView] setImage:cellIcon];
CGRect labelFrame = CGRectMake(65, 18, 150, 25);
UILabel *iconsNameLabel = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
iconsNameLabel.font = [UIFont boldSystemFontOfSize:18];
iconsNameLabel.text = [iconsList objectAtIndex:indexPath.row];
[cell.contentView addSubview:iconsNameLabel];
return cell;
}
顺便说一下,我已经在头文件中声明了我的开关并将其设置为属性并合成它。
答案 0 :(得分:1)
因此,无论何时移动到屏幕上,您编写的代码都会为每个单元格添加一个新按钮。你需要做一些与你的iconsImages
和iconsList
非常类似的事情(我假设是NSArray的)。
以下是您需要做的事情:
1在头文件中添加新的NSMutableArray
,然后在源文件中正确初始化它。这应该与现有的两个数组几乎相同。假设你称之为iconsSwitchStates
。
2创建开关时,请设置标记和状态,如下所示:
[switch1 setTag:indexPath.row];
if ([iconsSwitchStates count] > indexPath.row) {
[switch1 setOn:[iconsSwitchStates objectAtIndex:[indexPath.row]];
}
3在您已有的功能(buttonPressed:
)中,您需要设置开关的状态。
[iconsSwitchStates replaceObjectAtIndex:sender.tag withObject:[NSNumber numberWithBool:sender.on]];
答案 1 :(得分:0)
根据Inafziger的回答,我正在使用另一种方法(对于一个UISwitch,使用略有不同的方法):
您有NSMutableArray *swState
和UISwitch *sw
在您的cellforRowAtIndexPath:
方法中(您创建切换的位置):
[sw setOn:[swState count]];
在发件人方法中:
if ([swState count] > 0)
{
[swState removeObjectAtIndex:0];
}
else
{
[swState addObject:@"foo"];
}