【问题标题】:How do I maintain the selected index of UISegmentedControl inside a UITableViewCell when the cell is reloaded?重新加载单元格时,如何在 UITableViewCell 中维护 UISegmentedControl 的选定索引?
【发布时间】:2023-03-26 09:36:01
【问题描述】:

我有一个自定义 UITableViewCell ,其中包含一个 UISegmentedControl ,如下所示: #导入

@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 添加到一个数组并将其发送到在线 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;
}

【问题讨论】:

    标签: iphone ios4 uitableview uisegmentedcontrol


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为这可能是唯一的方法,但我不打算从 UISegmentedControl 调用任何选择器。如果我这样做了,我需要调用一个方法,该方法需要识别哪个单元格的 UISegmentedControl 已更改值。我会调查一下,但理想情况下我可以避免这样下去!
    • 冒险尝试并成功了。感谢您的回答。我已经在问题中包含了我重新编写的代码。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2018-01-11
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      相关资源
      最近更新 更多