我有一个带有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;
}
答案 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:
中分配它。