次のように私はそれにUISegmentedControlでカスタムUITableViewCellのを持っている: の#importセルがリロードされたときに、UITegmentControlの選択されたインデックスをUITableViewCell内に維持する方法を教えてください。
@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ファイルに送信して処理します。感謝
アイデア:)
対処:
IはTFSegmentedControlCell.h
にint row
を加えそしてIは場合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"];
}
そして、細胞のitialisation:
- (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;
}
私はこれを行う唯一の方法かもしれないと思ったが、私はUISegmentedControlからセレクタを呼び出すつもりはない。 私は、どのセルのUISegmentedControlが値を変更したのかを識別するメソッドを呼び出す必要があります。 私はそれを調べるでしょうが、理想的には私はそのような方法を避けることができます! – Tim
突っ込んだところでやった。ご回答有難うございます。私は、修正したコードを質問に含めました。 – Tim