开发中遇到的问题-动态创建按钮并且添加带有参数的点击事件

背景是开发游戏中的消息系统,进入游戏时会自动从服务器中下载离线时没收到的消息,所以,UGUI会根据收到的消息的数量,动态生成这个数量的消息点击按钮,放在消息列表中,但是问题出在:

由于按钮是批量生成的,所有的按钮公用一个点击事件,但是每个按钮根据服务器传来的参数不同,要生成不同的消息框和内容,所以急需一个能够传递参数的点击事件,在查找资料的过程中,看到了一篇博客http://www.tuicool.com/articles/nyeqie,这篇文章中使用委托的方法进行传参,是我目前能够解决项目中问题的方法。

下面看代码:

由于按钮需要大量Load所以使用了ResMgr框架,框架会在后面的开发回顾中贴出

    /// <summary>
    /// 点击了消息查看按钮
    /// </summary>
    private void ButtonClickmessage()
    {
        Debug.Log("即将查看消息");
        btn_message.GetComponent<MessageButtonShow>().flag = false;

        while (messageStack.Count > 0)
        {
            //从资源中加载按钮
            ResMgr.Instance.Load(UIDef.btn_msg, this);
        }
        img_message.SetActive(true);
    }


当点击消息查看按钮,会自动从先前保存的消息的堆栈里逐条读取数据,并且生成按钮。

           ResMgr.Instance.Load(UIDef.btn_msg, this);

这句代码就是生成操作,会有一个加载完成的回调函数,下面是回调函数:

    /// <summary>
    /// 资源加载完成后的回调
    /// </summary>
    /// <param name="asset"></param>
    public void Finish(object asset)
    {
        //消息出栈
        protos.ReturnMessage.ResSysMessage.MessageModel msg = messageStack.Pop();
        GameObject objMsg = Instantiate(asset as GameObject);
        objMsg.gameObject.SetActive(true);
        Button btn_msg = objMsg.GetComponent<Button>();
        btn_msg.transform.FindChild("Text_t").GetComponent<Text>().text = msg.type;
        btn_msg.transform.FindChild("Text_c").GetComponent<Text>().text = msg.title;
        //将消息赋值给数据传输工具类
        btn_msg.GetComponent<DataTransfer>().ModelTransfer = msg;
        //添加的消息列表
        MsgList.Add(btn_msg);
        //添加按钮点击事件
        btn_msg.onClick.AddListener(delegate () { this.OnClickMsg(msg); });
        //将按钮放到消息面板下
        btn_msg.transform.parent=img_message_box.transform;   
    }


回调函数的参数是加载完成的物体
这里一步一步的生成按钮并添加点击事件

       btn_msg.onClick.AddListener(delegate () { this.OnClickMsg(msg); });

这句话也就是这篇文章的主题。传递一个有参数的方法用于传递参数。这样点击事件就能接收参数了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值