如何从事件中删除/取消注册事件处理程序

本文关键字:取消 注册 事件处理 程序 删除 事件 | 更新日期: 2023-09-27 18:08:54

我已经制作了一个自定义的uitableviewcell。单元格由标签和UIButton组成。一切都工作得很好,直到我发现有一个小问题与可重复使用的单元结合添加事件到uibutton。第一次单元格工作得很好,当我点击uibutton。但当我滚动时,它开始给我错误的细节信息。如果我注释掉可重用的单元格部分(并让它每次都生成一个新单元格),它就可以正常工作,没有问题。所以我的假设是,事件"挂在"与旧信息的单元格。我像这样添加事件:

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

显然我不能像这样取消注册,对吧?在单触中克服这个特殊问题的最简单方法是什么?

如何从事件中删除/取消注册事件处理程序

可以使用匿名方法和lambdas作为事件处理程序。只需将它们保存为本地变量即可。

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;
}

如果您希望能够注销事件处理程序,则不应该使用匿名方法(或lambdas)。将代码移动到一个实际的方法中,并像这样注册它:

private void MyMethod()
{
  //some code here
}
// register
myButton.TouchDown += MyMethod;
// unregister
myButton.TouchDown -= MyMethod;

OK。我已经尝试了很多东西来解决这个问题,但是christr为我的特殊问题提供了正确的解决方案。我将在这里展示他的示例片段:

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。行到按钮。标签。您将使用该索引来知道按下了哪个按钮,并相应地执行操作。

希望这对你有帮助,如果你被卡住了。

你可能想使用这种技术来确定哪个UIButton被按下,而不是试图使用自定义事件参数,这将是有问题的- http://jainmarket.blogspot.com/2009/05/custom-button-in-uitableviewcell.html

本质上你只是计算出在UITableViewCell中选择了哪个section/行。从那里,你应该能够工作出什么UIButton被选中。

希望有帮助,

ChrisNTR