2015-09-21 2 views
0

Я реализую функцию флажка контакта в своем UITableView, используя следующий код.Задача C - Проблемы с флажком TableView с помощью разделов

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

Я предполагаю, что это имеет какое-то отношение к ошибке в создании моей ячейки, но я не совсем уверен, что.

- (void)viewDidLoad { 

    ... 

    self.checkedUsers = [[NSMutableArray alloc] init]; 

    for (int i=0; i<self.allContacts.count; i++) { 
     [self.checkedUsers insertObject:@"FALSE" atIndex:i]; 
    } 

    ... 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *simpleTableIdentifier = @"SocietyContactCell"; 
    SocietyContactCell *cell = (SocietyContactCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

      if (cell == nil) {   
      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SocietyContactCell" owner:self options:nil]; 
cell = [nib objectAtIndex:0]; 
      } 

    BOOL checked = [[self.checkedUsers objectAtIndex:indexPath.row] boolValue]; 
    UIImage *image = (checked) ? [UIImage imageNamed:@"checkedContact.png"] : [UIImage imageNamed:@"uncheckedContact.png"]; 

    [cell.checkButton setBackgroundImage:image forState:UIControlStateNormal]; 
    [cell.checkButton addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside]; 
} 

- (void)buttonPressedAction:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    int row = button.tag; 

    BOOL checked = [[self.checkedUsers objectAtIndex:row] boolValue]; 
    [self.checkedUsers removeObjectAtIndex:row]; 
    [self.checkedUsers insertObject:(checked) ? @"FALSE":@"TRUE" atIndex:row]; 

    UIImage *newImage = (checked) ? [UIImage imageNamed:@"uncheckedContact.png"] : [UIImage imageNamed:@"checkedContact.png"]; 
    [button setBackgroundImage:newImage forState:UIControlStateNormal]; 

} 

EDIT: теперь я понимаю, что проблема, скорее всего, исходя из моего использования разделов в этом TableView. Контакты сортируются в алфавитном порядке, что приводит к портированию моих тегов.

Как бы решить эту проблему с помощью разделов?

+0

Где вы инициализировать массив itsToDoChecked? –

+0

@ ClausBönnhoff извините, я отредактировал код –

ответ

0

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

Вам нужно будет создать глобальный массив, который сохранит статус галочки для каждого indexPath. Затем вы можете установить статус кнопки галочки checked/unchecked в методе cellForRowAtIndexPath.

Добавьте следующий фрагмент кода вместе с кодом шоу:

[cell.checkButton addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside]; 
[cell.checkButton setTag:indexPath.row]; 

Кроме того, заменить эти строки:

[self.checkedUsers removeObjectAtIndex:row]; 
[self.checkedUsers insertObject:(checked) ? @"FALSE":@"TRUE" atIndex:row]; 

с этим:

[self.checkedUsers replaceObjectAtIndex:row withObject:checked ? @"TRUE" : @"FALSE"]; 
+0

i'm confused ... не мой код в пути cellForRowAtIndex корректно проверяет массив checkedUsers, чтобы определить статус флажка? –

+0

добавление ваших фрагментов, к сожалению, не решило проблему ... –

+0

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

0

Я не вижу где вы устанавливаете button.tag каждый раз в cellForRowAtIndexPath :, поэтому метод действия может обновлять неправильную строку в ваших s elf.checkedUsers, хотя метод действия самостоятельно обновляет изображение ячейки в настоящий момент. Однако при прокрутке вверх и вниз дисплей возвращается к состоянию в массиве self.checkedUsers.

Вы, вероятно, нужна строка:

cell.checkButton.tag = indexPath.row; 

в вашем cellForRowAtIndexPath: метод.

Во-вторых, ваш метод действия получает состояние self.itsToDoChecked, а затем обновляет массив self.checkedUsers, когда он появляется, он должен воздействовать на один и тот же массив (просто изменяя состояние данного индекса строки). Не уверен, что это всего лишь примерный код или что-то важное.

Редактировать: Также возможно, что в подклассе ячейки возникают проблемы; трудно быть уверенным. Вы хотите реализовать -prepareForReuse в этом классе (и всегда вызывайте супер), чтобы сбросить любое состояние до начальных значений.

+0

добавление тега, похоже, не решает проблему ... и да, это была опечатка. Я отредактировал –

+0

Итак, если вы выходите из тега в методе действий, всегда ли он правильный? –

+0

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

0

В вашем SocietyContactCell классе добавьте следующий метод:

- (void)prepareForReuse { 
    [super prepareForReuse]; 
    [self.checkButton setBackgroundImage:nil forState:UIControlStateNormal]; 
}