2011-09-15 21 views
3

私はカスタムのuitableviewcellを作った。セルは、ラベルとUIButtonで構成されています。再利用可能なセルに小さな問題があり、それにuibuttonにイベントを追加することと組み合わせて、すべてがうまくいきました。 uibuttonをクリックすると、初めてセルがうまく動作します。しかし、私がスクロールすると間違った詳細情報が与えられます。私が再利用可能なセル部分をコメントアウトして(毎回新しいセルを作成させる)、問題なく正常に動作します。だから、私の前提は、イベントが古い情報を持つセルに「ハングする」ということです。 は、私はこのようなイベントを追加します。イベントからイベントハンドラを削除/登録解除するにはどうすればよいですか?

明らか
myButton.TouchDown += delegate{ 
    //some code here 
} 

私はこの右のようにそれを登録解除することはできませんか? モノトゥッチのこの特定の問題を克服する最も簡単な方法は何ですか?

答えて

3

OK

ChrisNTR。私はこれを解決するために多くのものを試してきましたが、ChrisNTRは私の特定の問題に適切な解決策をもたらしました。私は彼の例のスニペットをここに示します:

public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath) 
{ 
var cell = tableView.DequeueReusableCell("reuseThis"); 
if(cell == null) 
{ 
cell = new UITableViewCell(UITableViewCellStyle.Default, "reuseThis"); 
} 

cell.TextLabel.Text = Convert.ToChar(dash.oneToHundred[indexPath.Row]).ToString(); 

var button = UIButton.FromType(UIButtonType.RoundedRect); 
button.Frame = new System.Drawing.RectangleF(40f, 0f, 280f, 40f); 
button.SetTitle(dash.oneToHundred[indexPath.Row].ToString(),UIControlState.Normal); 
button.AddTarget (this, new Selector ("MySelector"), UIControlEvent.TouchDown); 
button.Tag = indexPath.Row; 
cell.ContentView.AddSubview(button); 

return cell; 
} 

[Export ("MySelector")] 
void ButtonEventHere (UIButton button) 
{ 

Console.WriteLine ("Hello! - Button clicked = " + button.Tag); 
Console.WriteLine (Convert.ToChar(dash.oneToHundred[button.Tag]).ToString()); 
} 

短いと、ボタンに対応する値をボタンに渡します。これらの値の1つは、 'buttonEventHere'として定義したセレクタです([export( "MySelector")]に正しい名前が付いていることを確認してください)。 indexPath.Rowをbutton.Tagに渡してください。そのインデックスを使用して、どのボタンが押されたかを知り、それに応じてアクションを実行します。

もしあなたが私のように抱かれていたなら、これは役に立ちます。

3

イベントハンドラの登録を解除する場合は、匿名メソッド(またはlambda)を使用しないでください。コードを実際のメソッドに移動し、次のように登録します。

private void MyMethod() 
{ 
    //some code here 
} 

// register 
myButton.TouchDown += MyMethod; 

// unregister 
myButton.TouchDown -= MyMethod; 
9

イベントハンドラとして匿名メソッドとラムダを使用できます。ローカル変数として保存するだけです。

あなたはUIButtonが、むしろ問題になるだろうカスタムイベント引数を使用しようとするよりも、押された動作するように、この技術を使用することがあります
EventHandler theHandler = delegate(obj sender, EventArgs e) 
{ Console.WriteLine("The handler!"); }; 
//... or: EventHandler theHandler = (sender, args) => { Console.WriteLine("The handler!"); }; 
private void HookEvent() 
{ 
    myButton.TouchDown += this.theHandler; 
} 

private void UnhookEvent() 
{ 
    myButton.TouchDown -= this.theHandler; 
} 
+0

あなたは正しいですが、それはとても醜いです! – skolima

関連する問題