2011-06-23 1 views
0

次のように私はそれに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; 
} 

答えて

1

テーブルビューにセルが必要になるたびにtableView:cellForRowAtIndexPath:が呼び出されます。したがって、そのメソッドのどこか(たとえば、質問のタイトルを割り当てる場所)では、現在のセルのセグメント化されたコントロールの選択されたインデックスを設定する必要があります。理想的には、あなたがこのような何か行うことができます:

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

questionsArrayであなたのオブジェクトは、(例えば)NSIntegerプロパティselectedIndexが必要であることを意味し、それは各行のための選択セグメントインデックスの値を反映することになります。

+0

私はこれを行う唯一の方法かもしれないと思ったが、私はUISegmentedControlからセレクタを呼び出すつもりはない。 私は、どのセルのUISegmentedControlが値を変更したのかを識別するメソッドを呼び出す必要があります。 私はそれを調べるでしょうが、理想的には私はそのような方法を避けることができます! – Tim

+0

突っ込んだところでやった。ご回答有難うございます。私は、修正したコードを質問に含めました。 – Tim

0

は覚えておいて、テーブルビュー内のすべてのセルを使用すると、スクロールアップまたはダウンしたときに、画面オフの細胞をキューに入れ、テーブルビューから削除した後、添加することができる、つまり、再利用可能ですテーブルビューの現在のビューポートには、特定の行のステータスを覚えておいて、-tableView:cellForRowAtIndexPath:でセルを非常に時間を設定する理由もあります。したがって、問題の解決方法は、segmentedControlの選択したインデックスを変更するときに、そのインデックスを覚えておき、-tableView:cellForRowAtIndexPath:に割り当てます。