2011-09-15 136 views
3

我做了一個自定義的uitableviewcell。單元格由標籤和UIButton組成。一切工作正常,直到我發現可重複使用的單元存在一個小問題,並將事件添加到一個uibutton。 因此,當我點擊uibutton時,細胞第一次很好地工作。但是,當我滾動它開始給我錯誤的詳細信息。如果我註釋掉可重用的單元部分(並且讓它每次創建一個新單元),它就可以正常工作,沒有任何問題。所以我的假設是,事件'掛在'與舊信息的細胞。 我添加事件是這樣的:如何從事件中刪除/取消註冊事件處理程序?

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

很明顯,我不能註銷它像這樣對嗎? 在單點觸摸中克服這個特殊問題的最簡單方法是什麼?

回答

3

確定。我一直在嘗試很多東西來解決這個問題,但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()); 
} 

總之,您可以調用button.AddTarget()並將相應的值傳遞給按鈕。其中一個值是您定義爲'buttonEventHere'的選擇器(可以是您想要的任何名稱,我確信[export(「MySelector」)]具有正確的名稱)。確保你將indexPath.Row傳遞給button.Tag。您將使用該索引來知道哪個按鈕被按下,並相應地執行您的操作。

希望這有助於如果你像我一樣陷入困境。

3

如果您希望能夠取消註冊您的事件處理程序,則不應使用匿名方法(或lambda表達式)。將代碼移到實際的方法中,並如下注冊:

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

// register 
myButton.TouchDown += MyMethod; 

// unregister 
myButton.TouchDown -= MyMethod; 
9

您可以將匿名方法和lambda作爲事件處理程序。只需將它們保存爲局部變量。

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

相關問題