重新加载单元格时,如何在UITableViewCell内维护UISegmentedControl的选定索引?

时间:2011-06-23 14:56:37

标签: iphone ios4 uitableview uisegmentedcontrol

我有一个带有UISegmentedControl的自定义UITableViewCell,如下所示:     #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并将所有selectedSegments添加到一个Array并将其发送到在线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 个答案:

答案 0 :(得分:1)

每次tableView需要一个单元格时,它会调用tableView:cellForRowAtIndexPath:。因此,在该方法的某处(例如,您分配问题标题的位置),您需要设置当前单元格的分段控件的选定索引。理想情况下,你可以这样做:

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

这意味着questionsArray中的对象需要一个NSInteger属性selectedIndex(例如),它将反映每行所选段索引的值。

答案 1 :(得分:0)

请记住,表格视图中的每个单元格都是可重复使用的,这意味着,当您向上或向下滚动时,屏幕上的单元格可能会从表格视图中排队并删除,然后添加到表格视图的当前视图端口,这也是为什么你应该记住特定行的状态并在-tableView:cellForRowAtIndexPath:中配置你的单元格的原因。因此,这里的问题解决方案是,在更改segmentedControl的选定索引时,您应该记住它,然后在-tableView:cellForRowAtIndexPath:中分配它。