引言
我们经常碰到这样一个需求:用户点击了“删除”按钮,此时需要弹出一个“确认删除”的面板。根据用户点击的是“确认”还是“取消”,决定是执行“删除”操作还是什么都不做。
如果是你,接到这个需求会怎么做?
暴力的做法
如果是以前,我会这样做:
- 获取到"btn_delete",向它添加一个回调函数,打开"confirm_delete_panel"。
- 接着获取到"btn_confirm"和"btn_cancel",分别向它俩添加一个回调函数。
- 由于在UGUI中,button的默认回调函数是没有参数的,所以,我可能会再定义一个bool值"b_confirm_delete",通过设置这个bool值,再由控制业务逻辑的脚本根据此bool值进行下一步操作。
这样的话,我要写3个函数,1个bool值。思路上也是很繁琐。
使用委托
1.定义一个弹出"confirm_delete_panel"的委托。
public System.Action<System.Action<bool>> ShowPopupConfirmDeleteObject = null;
2.向此委托添加监听函数:
void Start(){
//向委托添加监听函数
LE_GUIInterface.Instance.delegates.ShowPopupConfirmDeleteObject += ShowPopupConfirmDeleteObject;
}
3.点击"btn_delete"后,执行
弹出"confirm_delete_panel"的委托。
由于ShowPopupConfirmDeleteObject的参数也是一个委托,所以此时我们定义
一个匿名函数:
根据输入的bool值,来决定是否执行“删除”操作。
private void OnSelectedObjectDeleteBtn(object p_obj, System.EventArgs p_args)
{
if (m_GUI3dObject.SelectedObject != null)
{
if (LE_GUIInterface.Instance.delegates.ShowPopupConfirmDeleteObject != null)
{
// show confirm delete popup
//调用委托,填入参数(另一个函数)
LE_GUIInterface.Instance.delegates.ShowPopupConfirmDeleteObject.Invoke
(
(bool p_isDeleteConfirmed)=>
{
// delte object if confirmed
if (p_isDeleteConfirmed)m_GUI3dObject.Delete();
}
);
}
else
{
Debug.LogError(" ");
}
}
else
{
Debug.LogError(" ");
}
}
4.执行的委托时,真正执行的监听函数:
由于监听函数可以拿到参数,所以可以执行参数所代表的的函数。将按钮对应的bool值传入,就真正执行
了委托传入的匿名函数。
private void ShowPopupConfirmDeleteObject(System.Action<bool> p_confirmCallback)
{
confirm_delete_box.gameObject.SetActive(true);
btn_confirm.onClick.AddListener(() =>
{
//调用上述委托的时候,也可以再次调用委托中传过来的参数
p_confirmCallback(true);//按下确认键,调用该函数,传入true
confirm_delete_box.gameObject.SetActive(false);
});
btn_cancel.onClick.AddListener(() =>
{
p_confirmCallback(false);
confirm_delete_box.gameObject.SetActive(false);
});
}