QFramework (v0.1.x)入门学习(八) UniRx 中的 ReactiveProperty

本文介绍如何利用ReactiveProperty在Unity中管理UI输入内容的状态,包括创建和修改两种状态,通过按钮点击和输入字段变化来触发状态更新,并展示了一个完整的示例,涉及枚举类型定义、状态订阅和响应等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1.引入命名空间

using UniRx;

2.定义一个枚举类型

   public enum UIInputContentState
    {
        Create,
        Modify,
    }

3. 定义一个 ReactiveProperty 对象

 public ReactiveProperty<UIInputContentState> State = 
               new UniRx.ReactiveProperty<UIInputContentState>(UIInputContentState.Create);

4.修改状态

  BtnCancel.onClick.AddListener(()=>{ 
                State.Value = UIInputContentState.Create; 
            });

5.订阅


        private void Awake()
        {
            State.Subscribe(State =>
            {
                if(State == UIInputContentState.Create)
                {
                    BtnUpdate.Hide();
                    BtnCancel.Hide();
                    InputField.text = string.Empty;
                }
                else
                {
                    BtnUpdate.Show();
                    BtnUpdate.interactable = false;
                    BtnCancel.Show();
                }
            });
          }

 

6.代码完整示例

/****************************************************************************
 * 2019.10 DESKTOP-SF453R4
 ****************************************************************************/

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using QFramework;
using QF.Extensions;
using UniRx;

namespace QFramework.Afra
{

    public enum UIInputContentState
    {
        Create,
        Modify,
    }

    public partial class UIInputContent : UIElement
    {
        public ReactiveProperty<UIInputContentState> State = new UniRx.ReactiveProperty<UIInputContentState>(UIInputContentState.Create);
 
        TodoItem mSelectedItemModel;
        TodoList mTodoListModel;
        public void Init(TodoList todoListModel)
        {
            mTodoListModel = todoListModel;
        }
        public void ModifyState(TodoItem selectedItemModel)
        {
            mSelectedItemModel = selectedItemModel;
            State.Value = UIInputContentState.Modify;
            InputField.text = selectedItemModel.Content;
           
        }

        private void Awake()
        {
            State.Subscribe(State =>
            {
                if(State == UIInputContentState.Create)
                {
                    BtnUpdate.Hide();
                    BtnCancel.Hide();
                    InputField.text = string.Empty;
                }
                else
                {
                    BtnUpdate.Show();
                    BtnUpdate.interactable = false;
                    BtnCancel.Show();
                }
            });



            BtnUpdate.onClick.AddListener(() =>
            {
                mSelectedItemModel.Content = InputField.text;
                SendMsg(new OnTodoItemUpdateMsg(mSelectedItemModel));
                State.Value = UIInputContentState.Create;
            });

            BtnCancel.onClick.AddListener(()=>{ 
                State.Value = UIInputContentState.Create; 
            });

            InputField.onValueChanged.AddListener(content =>
            {
                if (State.Value == UIInputContentState.Modify)
                {
                    if (BtnUpdate.interactable && content == mSelectedItemModel.Content)
                    {
                        BtnUpdate.interactable = false;
                    }
                    else if (!BtnUpdate.interactable && content != mSelectedItemModel.Content)
                    {
                        BtnUpdate.interactable = true;
                    }
                }

            });
            // 监听输入完成
            InputField.onEndEdit.AddListener(Content =>
            {
                if (State.Value == UIInputContentState.Create)
                {
                    if (Input.GetKeyDown(KeyCode.Return))
                    {
                        SendMsg(new OnTodoItemAddedMsg(new TodoItem()
                        {
                            Completed = false,
                            Content = Content
                        }));
                    }
                    InputField.text = string.Empty;
                }
            });
        }

        protected override void OnBeforeDestroy()
        {
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值