WedX - журнал о программировании и компьютерных науках

UISwitch сбрасывается при прокрутке TableView

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

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

Кстати, я объявил свой переключатель в заголовочном файле, установил его как свойство и синтезировал.

26.03.2012

  • Вы имеете в виду, что каждый раз, когда переключатель прокручивается *за пределы экрана, а затем снова включается, он снова включается или меняется, даже если вы немного прокручиваете? 27.03.2012
  • он меняется, когда переключатель прокручивается за пределы экрана... 27.03.2012
  • Я так и думал, исходя из кода. Это потому, что каждый раз, когда он появляется на экране, это новый переключатель. 27.03.2012
  • Что вы предлагаете? ... я пытался поместить его в if (cell == nil), но он тоже не работает ... я не очень привык к объективу c или iOS ... но я пробовал много разных вещей, но не повезло .. я прочитал несколько сообщений, и они предполагают, что это повторное использование ячеек .. любезно предложите! 27.03.2012
  • Добро пожаловать в Stack Overflow (SO)! Пожалуйста, принимайте ответы, когда кто-то помогает вам, чтобы показать правильный ответ и вознаградить их дополнительной репутацией за их помощь! 31.03.2012
  • Взгляните на мой ответ: goo.gl/5krjHp 12.08.2014

Ответы:


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]];
27.03.2012

2

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

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

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

[sw setOn:[swState count]];

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

if ([swState count] > 0)
{
     [swState removeObjectAtIndex:0];
}
else
{
     [swState addObject:@"foo"];
}
18.02.2013
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]