UISwitch滚动TableView时重置

时间:2012-03-26 23:10:36

标签: ios uitableview uiswitch

我长期以来一直在寻找这个,但没有得到任何明确的答案。

我的表格视图单元格中有一个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; 
}

顺便说一下,我已经在头文件中声明了我的开关并将其设置为属性并合成它。

2 个答案:

答案 0 :(得分:1)

因此,无论何时移动到屏幕上,您编写的代码都会为每个单元格添加一个新按钮。你需要做一些与你的iconsImagesiconsList非常类似的事情(我假设是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 *swStateUISwitch *sw

在您的cellforRowAtIndexPath:方法中(您创建切换的位置):

[sw setOn:[swState count]];

在发件人方法中:

if ([swState count] > 0)
{
     [swState removeObjectAtIndex:0];
}
else
{
     [swState addObject:@"foo"];
}