Как сохранить выбранный индекс UISegmentedControl внутри UITableViewCell, когда ячейка перезагружается? - PullRequest
0 голосов
/ 23 июня 2011

У меня есть пользовательский UITableViewCell с UISegmentedControl следующим образом: #import

@interface TFSegmentedControlCell : UITableViewCell {
    UISegmentedControl *segmentedControl;
    UILabel *questionTitle;     
}

@property (nonatomic, retain) UISegmentedControl *segmentedControl;
@property (nonatomic, retain) UILabel *questionTitle;

@end

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

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

    static NSString *CellIdentifier = @"Cell";

    TFSegmentedControlCell *cell = (TFSegmentedControlCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[TFSegmentedControlCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    NSArray *segmentHeaders = [[[self.questionsArray objectAtIndex:indexPath.row] valueForKey:@"answer_labels"] componentsSeparatedByString:@","];

    for (int i=0; i<[segmentHeaders count]; i++) {
        [cell.segmentedControl insertSegmentWithTitle:[segmentHeaders objectAtIndex:i] atIndex:cell.segmentedControl.numberOfSegments animated:NO];
    }

    cell.questionTitle.text = [NSString stringWithFormat:@"%u. %@",indexPath.row + 1,[[self.questionsArray objectAtIndex:indexPath.row] valueForKey:@"description"]];

    return cell;
}

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

В настоящее время я не вызываю никаких методов при выделении сегмента, просто повторяючерез все UISegmentedControls при нажатии кнопки «Готово», добавлении всех выбранных сегментов в массив и отправке его в онлайн-файл php для обработки.

Идеи высоко ценятся:)


Решение:

Я добавил int row к TFSegmentedControlCell.h

Затем я добавил метод, когдазначение UISegmentedControl изменяется:

-(void)selectedTFSegment:(id)sender { 
    TFSegmentedControlCell *cell = (TFSegmentedControlCell *)[[sender superview] superview]; 
    [[self.questionsArray objectAtIndex:cell.row] setValue:[NSString stringWithFormat:@"%i",cell.segmentedControl.selectedSegmentIndex] forKey:@"selectedSegment"]; 
} 

, а затем реконфигурируется инициализация ячеек:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int row = indexPath.row;
    static NSString *CellIdentifier = @"Cell";

    TFSegmentedControlCell *cell = (TFSegmentedControlCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[TFSegmentedControlCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    NSArray *segmentHeaders = [[[self.questionsArray objectAtIndex:row] valueForKey:@"answer_labels"] componentsSeparatedByString:@","];

    [cell.segmentedControl removeAllSegments];
    for (int i=0; i<[segmentHeaders count]; i++) {
        [cell.segmentedControl insertSegmentWithTitle:[segmentHeaders objectAtIndex:i] atIndex:cell.segmentedControl.numberOfSegments animated:NO];
    }

    cell.row = row;
    [cell.segmentedControl addTarget:self action:@selector(selectedTFSegment:) forControlEvents:UIControlEventValueChanged];

    if ([[self.questionsArray objectAtIndex:row] objectForKey:@"selectedSegment"] != nil) {
        int newIndex = [[[self.questionsArray objectAtIndex:row] objectForKey:@"selectedSegment"] intValue];
        [cell.segmentedControl setSelectedSegmentIndex:newIndex];
    } else {
        [cell.segmentedControl setSelectedSegmentIndex:UISegmentedControlNoSegment];
    }

   cell.questionTitle.text = [NSString stringWithFormat:@"%u. %@",indexPath.row + 1,[[self.questionsArray objectAtIndex:row] valueForKey:@"description"]];

    return cell;
}

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Каждый раз, когда вашему tableView нужна ячейка, он вызывает tableView:cellForRowAtIndexPath:. Итак, где-то в этом методе (например, где вы назначаете заголовок вопроса) вам необходимо установить выбранный индекс сегментированного элемента управления вашей текущей ячейки. В идеале вы могли бы сделать что-то вроде этого:

[cell.segmentedControl setSelectedSegmentIndex:
    [[self.questionsArray objectAtIndex:indexPath.row] valueForKey:@"selectedIndex"]];

Это означает, что вашим объектам в questionsArray требуется свойство NSInteger selectedIndex (например), которое будет отражать значение индекса выбранного сегмента для каждой строки.

0 голосов
/ 23 июня 2011

Помните, что каждая ячейка в табличном представлении может использоваться повторно, это означает, что при прокрутке вверх или вниз ячейки за пределами экрана можно ставить в очередь и удалять из табличного представления, а затем добавлять в порт текущего представления табличного представления,это также причина, почему вы должны помнить статус для конкретной строки и настраивать свою ячейку в самое время в -tableView:cellForRowAtIndexPath:.Итак, решение вашей проблемы здесь заключается в том, что при изменении выбранного индекса segmentedControl вы должны запомнить его, а затем назначить его в -tableView:cellForRowAtIndexPath:.

...