У меня есть пользовательский 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;
}