UISwitch Сбрасывает при прокрутке TableView - PullRequest
0 голосов
/ 27 марта 2012

Я долго искал это и не получил четкого ответа.

У меня есть 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 ]

1 голос
/ 27 марта 2012

Таким образом, ваш код, как написано, будет добавлять новую кнопку в каждую ячейку всякий раз, когда она перемещается на экран. Вам нужно сделать что-то очень похожее на ваши 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]];
0 голосов
/ 18 февраля 2013

Исходя из ответа Инафцигера, я использую альтернативу (немного другой подход для одного UISwitch):

У вас есть NSMutableArray *swState и UISwitch *sw

в вашем cellforRowAtIndexPath: методе (где вы создаете переключатель):

[sw setOn:[swState count]];

А в вашем методе отправителя:

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