2012-05-01 12 views
6

私は、テーブルが編集されているかどうかによってセルが異なるように構築されているテーブルビューを持っています。具体的には、編集モードでは選択スタイルは無しであり、編集モードではない場合には青色である。編集モードに入る/出るときにUITableViewCellを再描画する

私が1つを他のものに移行すると、一部のセルが更新されていないことに気付きました。簡単なロギングでは、たとえセルの外観が大幅に変化しても(アクセサリビューが正しく追加/削除されても)、テーブルビューは選択スタイルをリフレッシュしません。

ここでは何が起こっていますか? setEditingを呼び出すと、セルの一部の属性のみが更新されますか?おそらく、別のビュースタイル(例えばEditingAccessoryType)の割り当てを可能にする特定のメソッドを持つものだけでしょうか?私はEditingSelectionStyleの恩恵を受けると思います。

どうすれば解決できますか? setEditingをカスタマイズして、各セルのselectionStyleを変更しますか?私は、これを行うためにテーブルビューをどのように反復するかについてもわかりません。私が使用しているアニメーションのため、reloadDataはオプションではありません。

答えて

6

私は、setEditing:をカスタマイズすることで、表示されているセルを繰り返し処理し、それぞれのselectionStyleをokに設定することが判明しました。

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

    for (UITableViewCell *cell in [self.tableView visibleCells]) { 
      NSIndexPath *path = [self.tableView indexPathForCell:cell]; 
      cell.selectionStyle = (self.editing && (path.row > 1 || path.section == 0)) ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleBlue; 
    } 
} 
+7

なぜあなたはsetEditing:animated:をセルでオーバーライドする代わりに行うのですか? – jrturton

+0

ありがとう@jrturton、あなたの答えはよりエレガントです。 – xialin

+0

@jrturton、答えとしてあなたのコメントを追加できますか? – phatmann

2

UITableViewDelegate documentationを見ると、編集動作をカスタマイズする5つの方法があることがわかります。あなたが編集モードに入る前に、各セルに呼び出されるメソッドUITableViewDataSource documentation

- (BOOL)tableView:(UITableView *)tableView 
canEditRowAtIndexPath:(NSIndexPath *)indexPath 

もあります。

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView 
      editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 

については、編集可能なすべてのセルに対して同じことが呼び出されます。細胞の見た目を変えたい場合は、これらのいずれかで細胞を見ることができます。 (canEditRow..を実装しないと、すべての行が編集可能です前提としています。)


また

   - (void)tableView:(UITableView *)tableView 
willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 

が呼び出されます、その場合には、そのようなセルの上にスワイプすると編集モードに入るために他の方法があるかもしれないことに注意してください

編集モード「を削除するためにスワイプ」これを入力する場合、テーブルビューはにtableView送信します:willBeginEditingRowAtIndexPath:デリゲートへのメッセージは、それはそれを調整することができるように、あなたが上でスワイプセル用ユーザーのインターフェイスです。

+0

これは有用な情報であるが、実際の質問に対応していません。 setEditingをカスタマイズする必要があるかどうかを知りたいのは、すべてのvisibleCellを反復して、選択スタイルを設定することです.setEditingによって自動的に更新されないためです: - 答えはそうです。 –

+0

はい、自動的に行われる唯一のカスタマイズは、deleteButtonsが表示されたときにtableViewCellのcontentViewのサイズが変更されることです。それ以上のものをカスタマイズしたい場合は、これらのメソッドの1つ以上を実装する必要があります。 –

+0

私は、テキストラベルも自動的に更新されることに気付きましたが。 –

0

これはちょうどあなたのカスタムセルサブクラスでsetEditingメソッドを上書きし、スウィフト2.3上で動作します:

class MyCell: UITableViewCell { 

    override func setEditing(editing: Bool, animated: Bool) { 
     super.setEditing(editing, animated: animated) 
     //Place your code here... 
    } 

} 
関連する問題