UIControlEventValueChanged для UISwitch внутри UITableViewCell, запускается при прокрутке в представление - PullRequest
3 голосов
/ 01 апреля 2012

Может кто-нибудь объяснить, почему UIControlEventValueChanged срабатывает, когда UISwitch включен в ячейке табличного представления, но не, если он выключен во время прокрутки?

У меня есть 100+ строк в табличном представлении с данными, извлекаемыми из Core Data, когда UISwitch выключен, UIControlEventValueChanged не запускается, но если я переключаю переключатель в положение ON, когда переключатель (строка таблицы) появляется, он запускает UIControlEventValueChanged.

Я использую следующее для конфигурации ячейки

[customCell.seenSwitch addTarget:self action:@selector(seenSwitchChanged:) forControlEvents:UIControlEventValueChanged];

Метод seenSwitchChanged изменяет значение BOOL в Core Data для соответствия состоянию коммутатора.

При быстрой прокрутке табличного представления он заикается и лагает при срабатывании UIControlEventValueChanged.Я предполагаю, потому что табличное представление ищет данные из CoreData, а seenSwitchChanged также пытается получить доступ к CoreData

Если я закомментирую вышеприведенную строку, табличное представление плавно прокручивается.

Надеюсь, что объяснение понятнодовольно.

Большое спасибо

Мэтт

РЕДАКТИРОВАТЬ

-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    ECCustomCell *customCell = (ECCustomCell *)cell;
    ECPerson *person = [self.fetchedResultsController objectAtIndexPath:indexPath];

    customCell.name.text = [person valueForKey:@"name"];
    customCell.seenSwitch.on = [[person valueForKey:@"seen"] boolValue];

    [customCell.seenSwitch addTarget:self action:@selector(seenSwitchChanged:) forControlEvents:UIControlEventValueChanged];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCell"];
    [self configureCell:cell atIndexPath:indexPath];

    return cell;    
}

1 Ответ

0 голосов
/ 02 апреля 2012

Я думаю, что вы должны проверить результат удаления на ноль и выделить ячейку, если это произойдет.Я также думаю, что ваша теория верна в отношении установки переключателя на лету.Для устранения проблемы можно использовать хук делегата представления прокрутки на представлении таблицы, чтобы более лениво устанавливать значения только видимых переключателей.

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    [self setMySwitches];
}

- (void)setMySwitches {

    for (NSIndexPath *path in [self.tableView indexPathsForVisibleRows]) {
        // like your cell config logic
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...