如何从事件中移除/注销事件处理程序?

3

我制作了一个自定义的UITableviewCell。该单元格由标签和一个UIButton组成。一切正常,直到我发现可重用单元格与向一个UIButton添加事件相结合时存在小问题。第一次单击UIButton时,该单元格运行良好。但是,当我滚动后,它开始给我错误的详细信息。如果我注释掉可重用单元格部分(并让它每次都创建新的单元格),它就可以正常工作,没有任何问题。因此,我的假设是事件“挂起”在带有旧信息的单元格中。我是这样添加事件的:

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

显然,我不能像这样取消注册它,对吧? 在monotouch中,最简单的方法是如何解决这个问题?
4个回答

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

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;

0

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

基本上,你只需要确定在UITableViewCell中选择了哪个部分/行。从那里,你应该能够确定选择了哪个UIButton。

希望这可以帮助到你,

ChrisNTR


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接