4

編集モード中に複数のセルを選択するためにiOS 5の新機能を使用すると問題が発生します。アプリケーションの構造は次のとおりです。

-> UIViewController
---> UITableView
----> CustomUITableViewCell

UIViewControllerデリゲートとデータ ソースの両方です (要件上の理由からの代わりに をUITableView使用しており、変更できません)。セルは次のコードのように読み込まれます。UIViewControllerUITableViewControllerUITableView

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *cell = (CustomTableViewCell*)[tv dequeueReusableCellWithIdentifier:kCellTableIdentifier];
    if (cell == nil)
    {
        [[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCellXib" owner:self options:nil];     
        cell = self.customTableViewCellOutlet;    
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    // configure the cell with data
    [self configureCell:cell atIndexPath:indexPath];    

    return cell;
}

セル インターフェイスは、xib ファイルから作成されています。特に、スーパービューが要素で構成される新しい xib ファイルを作成しましたUITableViewCell。カスタマイズを提供するために、その要素の型を extends として設定CustomUITableViewCellCustomUITableViewCellますUITableViewCell

@interface CustomTableViewCell : UITableViewCell

// do stuff here

@end

コードはうまく機能します。テーブルにカスタム セルが表示されます。ここで、アプリケーションの実行中に に設定allowsMultipleSelectionDuringEditingYES、 の編集モードに入りますUITableView。それは働いているようです。実際、各セルの横に空の円が表示されます。問題は、行を選択しても空の円の状態が変わらないことです。理論的には、円は空のチェックマークから赤いチェックマークに、またはその逆に変化する必要があります。contentViewセルの の上に円が残っているようです。

私はたくさんの実験をしました。また、次の方法も確認しました。

- (NSArray *)indexPathsForSelectedRows

編集モードでの選択中に更新されます。選択した右のセルが表示されます。

あまり明確ではないのは、カスタムセルなしで のみで作業しようとするとUITableViewCell、円がその状態を正しく更新することです。

何か提案はありますか?前もって感謝します。

4

1 に答える 1

5

興味のある方のために、以前の問題を解決するための有効な解決策を見つけました。問題は、選択スタイルがUITableViewCellSelectionStyleNone赤いチェックマークの場合、編集モードで正しく表示されないことです。解決策は、カスタムを作成し、UITableViewCellいくつかのメソッドをオーバーライドすることです。awakeFromNib私のセルはxibを介して作成されているため、使用しています。解決策にたどり着くために、次の 2 つのスタックオーバーフロー トピックに従いました。

  1. multi-select-table-view-cell-and-no-selection-style
  2. uitableviewcell-how-to-prevent-blue-selection-background-wo-borking-isselected

ここにコード:

- (void)awakeFromNib
{
    [super awakeFromNib];

    self.backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"row_normal"]] autorelease];
    self.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"row_selected"]] autorelease];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if(selected && !self.isEditing)
    {

        return;
    }        

    [super setSelected:selected animated:animated];
}

- (void)setHighlighted: (BOOL)highlighted animated: (BOOL)animated
{
    // don't highlight
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];

}

それが役に立てば幸い。

于 2012-02-02T14:33:38.377 に答える