Iphone: галочки в UITableview путаются при прокрутке - PullRequest
0 голосов
/ 04 августа 2011

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

Может кто-нибудь дать мне несколько советов о том, как мне этого избежать или, возможно, взглянуть на мои методы и посмотреть, что-нибудь не так?

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

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

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

static NSString *CellIdentifier = @"Cell";

CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    [cell setAccessoryView:nil];
}

NSMutableArray *temp = [[NSMutableArray alloc]init];
for (int j = 0; j < [listOfRowersAtPractice count]; j++) {
    if ([[differentTeams objectAtIndex:indexPath.section] isEqualToString:[[rowersAndInfo objectForKey:[listOfRowersAtPractice objectAtIndex:j]]objectForKey:@"Team"]]) {
        [temp addObject:[listOfRowersAtPractice objectAtIndex:j]];
    }
}

[cell.cellText setText:[temp objectAtIndex:indexPath.row]]; 

[temp removeAllObjects];
[temp release];
// Set up the cell...


return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {


        [tableView deselectRowAtIndexPath:indexPath animated:YES];

        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        if (cell.accessoryType != UITableViewCellAccessoryCheckmark) {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }else {
            cell.accessoryType = UITableViewCellAccessoryNone;
        }
    }

Ответы [ 5 ]

1 голос
/ 04 августа 2011

Да, сохраните состояние выбранной строки и в cellforrowatindexpath после того, как ячейка вернет ее в состояние по умолчанию, проверит состояние строки и изменит ее состояние.1004 * Вы можете создать NSMutabaleArray с количеством элементов, равным количеству элементов в вашем источнике данных, который является именем temp в вашем коде.

При выборе вы можете фактически изменить значение в этом индексе на некоторый текст, например@ "selected" в созданном выше массиве.

В вашем cellforrowatindexpath вы можете проверить этот текст, если он выбран или не выбран, а затем изменить свойство ячейки.Это похоже на поддержание растрового состояния для выбранных и невыбранных состояний.

0 голосов
/ 26 июня 2015

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

static NSString *simpleTableIdentifier = @"SimpleTableCell";
SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) 
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
} 

cell.nameLabel.text = [tableData objectAtIndex:indexPath.row];
cell.thumbnailImageView.image = [UIImage imageNamed:[thumbnails objectAtIndex:indexPath.row]];
cell.prepTimeLabel.text = [prepTime objectAtIndex:indexPath.row];
checkbox = [[UIButton alloc]initWithFrame:CGRectMake(290, 5, 20, 20)];
[checkbox setBackgroundImage:[UIImage imageNamed:@"checkbox_empty.png"]
                                forState:UIControlStateNormal];

[checkbox addTarget:self action:@selector(checkUncheck:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:checkbox];
if(selectedRows.count !=0)
{
if([[selectedRows objectAtIndex:indexPath.row]integerValue]==1)
{
    [checkbox  setImage:[UIImage imageNamed: @"checkbox_full.png"] forState:UIControlStateNormal];
}
else
{
    [checkbox  setImage:[UIImage imageNamed: @"checkbox_empty.png"] forState:UIControlStateNormal];
}
}
return cell;
}

метод для определения выбора флажка:

- (IBAction)checkUncheck:(id)sender {
UIButton *tappedButton = (UIButton*)sender;

NSLog(@"%d",tappedButton.tag);
if ([[sender superview] isKindOfClass:[UITableViewCell class]]) {
    UITableViewCell *containerCell = (UITableViewCell *)[sender superview];
    NSIndexPath *cellIndexPath = [self.tableView indexPathForCell:containerCell];
    int cellIndex = cellIndexPath.row;
    NSLog(@"cell index%d",cellIndex);
    [selectedRows insertObject:[NSNumber numberWithInt:1] atIndex:cellIndex];

}
NSLog(@"%@",selectedRows);
if([tappedButton.currentImage isEqual:[UIImage imageNamed:@"checkbox_empty.png"]])
{
    [sender  setImage:[UIImage imageNamed: @"checkbox_full.png"] forState:UIControlStateNormal];
}
else
{
    [sender  setImage:[UIImage imageNamed: @"checkbox_empty.png"] forState:UIControlStateNormal];

}
}

не забудьте инициализировать массив selectedRows .. счастливого кодирования ... !!!

0 голосов
/ 05 ноября 2013

Вам необходимо обновить accessoryType ячейки, поскольку ячейка используется повторно, тогда она унаследовала accessoryType от повторно используемой ячейки, это решение:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"cellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    //Refresh acessory for cell when tableview have many cells and reuse identifier
    if([self.tableView.indexPathsForSelectedRows containsObject:indexPath]){
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else{
       cell.accessoryType = UITableViewCellAccessoryNone;
    }

    cell.textLabel.text = @"Your text cell";

    return cell;
}
0 голосов
/ 04 августа 2011

Попробуй:

static  NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d",indexPath.row];

У меня была такая же проблема на одном из приложений.

Что касается галочек, вы вообще используете базовое хранилище данных?

Если вы используете следующее ....

   - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath];

if ([[item valueForKey:@"checks"] boolValue]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [cell.textLabel setTextColor:[UIColor redColor]];
        [cell.detailTextLabel setTextColor:[UIColor redColor]];


} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
    [cell.textLabel setTextColor:[UIColor blackColor]];
    [cell.detailTextLabel setTextColor:[UIColor blackColor]];
}


}

И ......

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];



if ([[selectedObject valueForKey:@"checks"] boolValue]) {
    [selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"checks"];
} else {
    [selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"checks"];
}

[managedObjectContext save:nil];

}
0 голосов
/ 04 августа 2011

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

вам нужно сделать что-то вроде

CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    [cell setAccessoryView:nil];
}

cell.accessoryType = UITableViewCellAccessoryNone // This and other such calls to clean up the cell
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...