我有关于事件处理的概念性问题。
让分配给一个事件的几个匿名委托块。基本上,onedelegate会进行检查,如果检查失败,最终应该停止处理后面的块。
我知道可以将所有内容放入一个委托块中,并在需要时返回。
但是,当需要对多个对象进行检查时,代码必须在每个对象上。
object1.SomeEvent += delegate {
// check something
if (somethingHappened) {
// STOP!
return;
}
// do something for object1 (if nothing happened)
}
object2.SomeEvent += delegate {
// check something
if (somethingHappened) {
// STOP!
return;
}
// do something else for object2 (if nothing happened)
}
有可能做这样的事吗?如果是的话,该怎么做?
EventHandler checkSomething = delegate {
if (somethingHappened) {
// STOP!
// What to do here?
return; // This won't prevent the other event handlers from executing. :(
}
};
object1.SomeEvent += checkSomething;
object1.SomeEvent += delegate {
// do something for object1 (if nothing happened)
};
object2.SomeEvent += checkSomething;
object2.SomeEvent += delegate {
// do something else for object2 (if nothing happened)
}
修改
实际情况:
对象属于UIButton(MonoTouch / UIKit)类型,只要用户停止点击它们(在其框架内),就会收到事件TouchUpInside。
有一个错误情况应该阻止两个按钮做他们通常做的事情,而是显示一个UIAlertView警告用户有关错误情况。
答案 0 :(得分:1)
如果您拥有object1和object1的类,则可以自己完成事件的调用列表(而不是简单地调用事件)。
但它会变得非常混乱。考虑替代设计,例如将其拆分为2个事件(1进行检查)。
答案 1 :(得分:0)
如果以下事件处理程序应停止处理,只需使用CancelEventArgs
并将取消设置为true
。
EventHandler checkSomething = delegate {
if (somethingHappened) {
// STOP!
e.Cancel = true;
return; // This won't prevent the other event handlers from executing. :(
}
};
object1.SomeEvent += checkSomething;
object1.SomeEvent += delegate {
if(!e.Cancel) {
// do something for object1 (if nothing happened)
}
};
object2.SomeEvent += checkSomething;
object2.SomeEvent += delegate {
if(!e.Cancel) {
// do something else for object2 (if nothing happened)
}
}
答案 2 :(得分:-1)
如果我理解你想做什么,最好的做法就是:
EventHandler checkSomething = delegate(object sender, EventArgs e) {
if (somethingHappened) {
//STOP
return;
}//end if
UIButton theButton = (UIButton)sender;
if (theButton.Title == "Button1") {
//do something for Object1
}//end if
if (theButton.Title == "Button2") {
//do something for Object 2
}
};