2016-09-26 14 views
1

特定のユーザーのデータがあるかどうかに基づいてセルを非表示にしたいとします。私の現在のアプローチはエラーthe requested operation resulted in a stack overflowを引き起こします。(Xamarinの)UITableViewでのセルの非表示

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) 
    { 
     ... 
     cell.TextLabel.Text = items.Keys.ElementAt(indexPath.Row); 
     cell.DetailTextLabel.Text = items[items.Keys.ElementAt(indexPath.Row)]; 

     if (string.IsNullOrEmpty(cell.DetailTextLabel.Text)){ 
      cell.Hidden = true; 
      cell.Tag = 3; 
     } 
     return cell; 
    } 

public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath) 
    { 
     UITableViewCell cell = tableView.CellAt(indexPath); //ERROR HERE 
     if (cell.Tag == 3) 
     { 
      return 0; 
     } 
     return base.GetHeightForRow(tableView, indexPath); 
    } 

このエラーを回避し、正しく行を非表示にするにはどうすればよいですか?

答えて

2

私の推測では、あなたのスタックオーバーフローがどこから来ていることだ... GetCell()GetHeightForRow()を呼び出しGetCell()呼び出すGetHeightForRow()を呼び出すことです。

視覚表現(=セル)を使用して、行を表示するかどうかを判断しないでください。あなたの(データ)モデルがこれに責任を負うべきです。言い換えれば、あなたのitems辞書に含まれるオブジェクトタイプ(おそらくそれはPersonのタイプです)は、IsVisibleというようなものです。次にGetHeightForRow()でアイテムにアクセスし、プロパティを調べて行の高さを決定し、目に見えない行について0を返します。

ところで、私はあなたのコードのコンテキスト(*)を認識していませんが、一般的にはではありません。base.GetHeightForRow()としてください。メソッドはネイティブにObjectiveCプロトコルとして実装されたデリゲートの一部です。つまり、baseはありません。

(*)あなたはUITableViewSourceまたはUITableViewDataSourceから派生した場合baseを呼び出すときには副作用はありませんが、あなたはUITableViewControllerで直接メソッドを実装する場合は、You_Should_Not_Call_Base_Exceptionが表示される場合があります。

+0

ありがとうございます!私は脳のおならの瞬間をそこに持っていた(このイオスプロジェクトから1週間離れていた)、テーブルに典型的に関わるデータ構造の操作を忘れてしまった。 – panthor314

関連する問題