zoukankan      html  css  js  c++  java
  • PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例

    前言:

    1.关于PureMVC:

    MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了。嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西,也不喜欢看别人留下不清不楚的文档,还不如看代码来得实在。刚开始新人看代码是看得头晕,因为这样那样的东西不一定能完全猜得透。而老人家就算有经验和阅历,也没有这么多的体力去看一个庞大而又复杂的糟糕项目。因为这种需求,Unity3D的程序猿就统一组织起来,想做一个完整规范的程序框架,而这时,PureMVC就诞生了。我个人喜欢PureMVC的原因也很简单,因为它简单粗暴,和Unity3D之间没有依赖性,加上又开源,真的遇到Bug能拿到源代码来调试也是很容易执行的。Unity3D应用商店还有一个同类产品叫uFrame Game Framework,它对Unity版本有着依赖,拖视图虽然方便,但是一旦出bug真的改得够呛的,所以不推荐使用它。下文便是使用PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例。

    2.通过MVC模式在Unity项目当中应用的特别提醒:

    (1)Unity3D是基于组件设计的,如果没有好的规划,组件之间会产生复杂的调用关系,导致组件之间复杂的依赖,从而破坏了整个系统结构,因此需要设计时确定组件的层次关系,确保依赖关系只存在于下层对上层。而这个是业务逻辑设计问题,PureMVC帮不了你。
    (2)仅仅用上MVC,解决不了什么问题,或许解决了1%,剩下的99%就被挪到了MVC的C里,当你庆祝MVC竣工时,99%的问题在那里默默的微笑的看着你。(话说以前写PHP的CI框架时候,一堆东西扔到XxxAction.Class.php里面,发现和摆的乱七八糟的架构没区别,只是大家都习惯了这套框架的规矩,看代码找某个东西稍微好找而已,本质上还是考验基本功和对项目的熟悉程度的,23333)

    3.PureMVC通过4种pattern实现隔离变化:

    (1)facade非常适合将UI界面对游戏数据的依赖解耦,将UI操作数据的请求封装在facade 接口里面,同时数据变化对UI的影响可以通过notification事件通知来实现,该模式应用得非常常见。
    (2)command模式统一对对象的操作,将键盘输入,网络输入输出统一成command来操控游戏对象。
    (3)proxy维护数据,提供某块数据统一的初始化,访问和修改接口。
    (4)mediator没怎么用过,我们的游戏中的UI界面每次变化一般都是整体更新的,不常用局部更新。
    以上4中pattern请务必牢牢记住,请务必牢牢记住,请务必牢牢记住。重要的事情要说3便。

    4.PureMVC的流程示意图

    (1)在puremvc中,model/view/controller统一是由Facade类的单件实例来统筹管理的。
    (2)PureMVC的基本流程:启动PureMVC—>建立Mediator来操作视觉元素(按钮与文本框)—>点击按钮发送Notification->文本框接收Notification改变内容。
    (3)大致流程可理解为:通过Facade类的单件实例(即:统一的门面) 启动 puremvc环境,启动同时注册Command对象(相当于asp.net mvc中的controller),然后Command通过与之关联的facade(即前面的单件实例)来注册Mediator(中介者:用于把View与Command联系起来)。
    (4)当UI界面(即View)上有动静时(比如按钮点击了之类),与之关联的Mediator(中介者)会发送通知给facade,然后facade会调用command对象执行相关的处理。(即:消息响应)


    PureMVC示意图.png

    一.引入PureMVC的插件

    1.下载PureMVC

    请访问地址
    https://github.com/PureMVC/puremvc-csharp-standard-framework/wiki

    安装

    2.把PureMVC.DotNET.35.dll放到Plugins里面就好了。

    QA

    3.这里有一个很简单的基本案例可以参考一下
    http://www.open-open.com/lib/view/open1452657515480.html

    二.动手配置文件

    1.需要完成的实例如下:


    实现的界面效果.png

    2.具体实现的目标:

    (1)在Scripts文件夹下,分别设置模型、视图、控制器对应的文件夹Model、View、Controller,分别放置处理数据模型的脚本、处理显示视图的脚本、处理逻辑控制的脚本。
    (2)如界面,一个Unity3D和UGUI制作的简单员工管理系统,Employee Admin,其中员工界面Users显示有哪些员工在登记范围内,而New和Delete分别是添加和删除某个员工的信息。然后下面的员工信息界面User Profile则是对员工信息的一个具体编辑和修正。

    三.主要实现步骤

    1.启动文件AppFacade.cs 作为PureMVC框架的入口文件。

     1 using UnityEngine;
     2 using System.Collections;
     3 using PureMVC.Patterns;
     4 using PureMVC.Interfaces;
     5 
     6 //Facade模式的单例
     7 public class ApplicationFacade : Facade
     8 {
     9     //实例化函数,保证单例模式(Singleton)运行该函数
    10     public new static IFacade Instance
    11     {
    12         get
    13         {
    14             if(m_instance == null)
    15             {
    16                 lock(m_staticSyncRoot)
    17                 {
    18                     if (m_instance == null)
    19                     {
    20                         Debug.Log("ApplicationFacade");
    21                         m_instance = new ApplicationFacade();
    22                     }
    23                 }
    24             }
    25             return m_instance;
    26         }
    27     }
    28     //启动PureMVC的入口函数
    29     public void Startup(MainUI mainUI)
    30     {
    31         Debug.Log("Startup() to SendNotification.");
    32         SendNotification(EventsEnum.STARTUP, mainUI);
    33     }
    34     //该类的构造器
    35     protected ApplicationFacade()
    36     {
    37 
    38     }
    39     //设置静态
    40     static ApplicationFacade()
    41     {
    42 
    43     }
    44     //初始化控制器函数
    45     protected override void InitializeController()
    46     {
    47         Debug.Log("InitializeController()");
    48         base.InitializeController();
    49         RegisterCommand(EventsEnum.STARTUP, typeof(StartupCommand));
    50         RegisterCommand(EventsEnum.DELETE_USER, typeof(DeleteUserCommand));
    51     }
    52 }

    2.对PureMVC需要处理的事件用EventsEnum.cs存放

     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 //处理事件的枚举
     5 public class EventsEnum
     6 {
     7     public const string STARTUP = "startup";//启动事件
     8 
     9     public const string NEW_USER = "newUser";//新建用户
    10     public const string DELETE_USER = "deleteUser";//删除用户
    11     public const string CANCEL_SELECTED = "cancelSelected";//取消选择
    12 
    13     public const string USER_SELECTED = "userSelected";//选择用户
    14     public const string USER_ADDED = "userAdded";//添加用户
    15     public const string USER_UPDATED = "userUpdated";//更新用户
    16     public const string USER_DELETED = "userDeleted";//删除用户
    17 
    18     public const string ADD_ROLE = "addRole";//添加角色
    19     public const string ADD_ROLE_RESULT = "addRoleResult";//查询添加角色的结果
    20 }

    3.然后在Unity的场景中创建一个MainUI.cs文件,挂在需要启动PureMVC的组件上。就可以启动了。

     1 using UnityEngine;
     2 using System.Collections;
     3 
     4 //处理该UI场景的入口
     5 public class MainUI : MonoBehaviour
     6 {
     7     public UserList userList;
     8     public UserForm userForm;
     9     //启动函数
    10     void Awake()
    11     {
    12         //启动PureMVC程序,执行StartUP()方法
    13         ApplicationFacade facade = ApplicationFacade.Instance as ApplicationFacade;
    14         facade.Startup(this);
    15     }
    16 }

    4.对Controller部分进行处理

    然后我们对执行逻辑的处理事件进行补充。新建一个文件夹Controller,暂时先放置StartupCommand.cs和DeleteUserCommand.cs。处理上述所说的逻辑事件
    首先,处理启动事件

     1 using UnityEngine;
     2 using System.Collections;
     3 using PureMVC.Patterns;
     4 using PureMVC.Interfaces;
     5 
     6 //启动事件
     7 public class StartupCommand : SimpleCommand, ICommand
     8 {
     9     //复写原有的Execute执行函数
    10     public override void Execute(INotification notification)
    11     {
    12         //注册统一的数据接口UserProxy,给其他事件处理
    13         Debug.Log("StartupCommand.Execute()");
    14         Facade.RegisterProxy(new UserProxy());
    15 
    16         //注册局部界面Mediator,给其他事件处理
    17         MainUI mainUI = notification.Body as MainUI;
    18         Facade.RegisterMediator(new UserListMediator(mainUI.userList));
    19         Facade.RegisterMediator(new UserFormMediator(mainUI.userForm));
    20     }
    21 }

    其次,处理删除用户事件

     1 using PureMVC.Patterns;
     2 using PureMVC.Interfaces;
     3 
     4 //删除用户事件
     5 public class DeleteUserCommand : SimpleCommand, ICommand
     6 {
     7    //复写原有的Execute执行函数
     8     public override void Execute(INotification notification)
     9     {
    10         //获取要删除的对象user
    11         UserVO user = (UserVO)notification.Body;
    12         //获取处理数据操作的userProxy
    13         UserProxy userProxy = (UserProxy)Facade.RetrieveProxy(UserProxy.NAME);
    14 
    15         //操作数据,删除user
    16         userProxy.DeleteItem(user);
    17         //删除完毕,广播USER_DELETED进行通知
    18         SendNotification(EventsEnum.USER_DELETED);
    19     }
    20 }

    5.对Model部分进行处理

    然后是对Model模型数据的定义哈,首先要记录的信息用UserVO来表示

     1 using UnityEngine;
     2 using System.Collections;
     3 //显示用的数据信息UserViewObject
     4 public class UserVO
     5 {
     6     //用户名
     7     public string UserName
     8     {
     9         get { return m_userName; }
    10     }
    11     private string m_userName = "";
    12     //名字
    13     public string FirstName
    14     {
    15         get { return m_firstName; }
    16     }
    17     private string m_firstName = "";
    18     //姓氏
    19     public string LastName
    20     {
    21         get { return m_lastName; }
    22     }
    23     private string m_lastName = "";
    24     //邮箱
    25     public string Email
    26     {
    27         get { return m_email; }
    28     }
    29     private string m_email = "";
    30     //密码
    31     public string Password
    32     {
    33         get { return m_password; }
    34     }
    35     private string m_password = "";
    36     //部门
    37     public string Department
    38     {
    39         get { return m_department; }
    40     }
    41     private string m_department = "";
    42     //是否合法
    43     public bool IsValid
    44     {
    45         get
    46         {
    47             return !string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(Password);
    48         }
    49     }
    50     //合并名字
    51     public string GivenName
    52     {
    53         get { return LastName + ", " + FirstName; }
    54     }
    55     //构造器
    56     public UserVO()
    57     {
    58     }
    59     //构造函数
    60     public UserVO(string uname, string fname, string lname, string email, string password, string department)
    61     {
    62         if (uname != null) m_userName = uname;
    63         if (fname != null) m_firstName = fname;
    64         if (lname != null) m_lastName = lname;
    65         if (email != null) m_email = email;
    66         if (password != null) m_password = password;
    67         if (department != null) m_department = department;
    68     }
    69 }

    接着对操作数据的UserProxy进行补充

     1 using UnityEngine;
     2 using System.Collections.Generic;
     3 using PureMVC.Patterns;
     4 using PureMVC.Interfaces;
     5 
     6 //数据操作
     7 public class UserProxy : Proxy, IProxy
     8 {
     9     public new const string NAME = "UserProxy";
    10 
    11     //返回数据操作类
    12     public IList<UserVO> Users
    13     {
    14         get { return (IList<UserVO>) base.Data; }
    15     }
    16 
    17     //构造函数,添加几条数据进去先
    18     public UserProxy():base(NAME, new List<UserVO>())
    19     {
    20         Debug.Log("UserProxy()");
    21         //添加几条测试用的数据        
    22         AddItem(new UserVO("lstooge", "Larry", "Stooge", "larry@stooges.com", "ijk456", "ACCT"));
    23         AddItem(new UserVO("cstooge", "Curly", "Stooge", "curly@stooges.com", "xyz987", "SALES"));
    24         AddItem(new UserVO("mstooge", "Moe", "Stooge", "moe@stooges.com", "abc123", "PLANT"));
    25         AddItem(new UserVO("lzh", "abc", "def", "lzh@stooges.com", "abc123", "IT"));
    26     }
    27 
    28     //添加数据的方法
    29     public void AddItem(UserVO user)
    30     {
    31         Users.Add(user);
    32     }
    33 
    34     //更新数据的方法
    35     public void UpdateItem(UserVO user)
    36     {
    37         for (int i = 0; i < Users.Count; i++)
    38         {
    39             if (Users[i].UserName.Equals(user.UserName))
    40             {
    41                 Users[i] = user;
    42                 break;
    43             }
    44         }
    45     }
    46 
    47     //删除数据的方法
    48     public void DeleteItem(UserVO user)
    49     {
    50         for (int i = 0; i < Users.Count; i++)
    51         {
    52             if (Users[i].UserName.Equals(user.UserName))
    53             {
    54                 Users.RemoveAt(i);
    55                 break;
    56             }
    57         }
    58     }
    59 }

    6.接下来对VIew部分进行实现

    显示用户界面列表的UserList和填写用户具体信息的UserForm
    列表单条数据部分

     1 using UnityEngine;
     2 using UnityEngine.UI;
     3 using System.Collections;
     4 
     5 //UserList列表当中单条数据信息
     6 public class UserList_Item : MonoBehaviour
     7 {
     8     //定义UI组件
     9     public Text txt_userName;//用户名文本框
    10     public Text txt_firstName;//名字文本框
    11     public Text txt_lastName;//姓氏文本框
    12     public Text txt_email;//邮件文本框
    13     public Text txt_department;//部门文本框
    14 
    15     //定义User信息类
    16     public UserVO userData;
    17 
    18     //更新User类
    19     public void UpdateData(UserVO data)
    20     {
    21         //获取需要更改的User信息
    22         this.userData = data;
    23 
    24         //更改UI的文字信息
    25         txt_userName.text = data.UserName;
    26         txt_firstName.text = data.FirstName;
    27         txt_lastName.text = data.LastName;
    28         txt_email.text = data.Email;
    29         txt_department.text = data.Department;
    30     }
    31 }

    用户列表部分

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    using System.Collections.Generic;
    
    //UserList用户界面列表部分
    public class UserList : MonoBehaviour
    {
        //定义UI组件
        public Text txt_userCount;//用户列表文本框
        public UGUI_MyToggleGroup myToggleGroup;//用户列表滑动条
        public Button btn_New;//新建按钮
        public Button btn_Delete;//删除按钮
        public UserList_Item itemPrefab;//单个列表文件的预置体
        List<UserList_Item> itemList = new List<UserList_Item>();//临时存列表
    
        //定义事件操作
        public System.Action NewUser;//添加用户事件
        public System.Action DeleteUser;//删除用户事件
        public System.Action SelectUser;//选择用户事件
    
        //定义数据
        public UserVO SelectedUserData;//列表中选择好的用户
        private IList<UserVO> m_currentUsers;//当前选择的用户
    
        //开始函数
        void Start ()
        {
            itemPrefab.gameObject.SetActive(false);
    
            myToggleGroup.onToggleChange.AddListener(onSelectUserItem);
            btn_New.onClick.AddListener(onClick_btn_New);
            btn_Delete.onClick.AddListener(onClick_btn_Delete);
    
            UpdateButtons();
        }
        //加载用户
        public void LoadUsers(IList<UserVO> list)
        {
            m_currentUsers = list;
            RefreshUI(list);
        }
        //点击新建
        void onClick_btn_New()
        {
            if (NewUser != null) NewUser();
        }
        //点击删除
        void onClick_btn_Delete()
        {
            if (DeleteUser != null) DeleteUser();
        }
        //选择物体
        void onSelectUserItem(Toggle itemToggle)
        {
            if (itemToggle == null)
            {
                return;
            }
    
            UserList_Item item = itemToggle.GetComponent<UserList_Item>();
            this.SelectedUserData = item.userData;
            UpdateButtons();
            if (SelectUser != null) SelectUser();
    
        }
        //取消选择
        public void Deselect()
        {
            myToggleGroup.toggleGroup.SetAllTogglesOff();
            this.SelectedUserData = null;
            UpdateButtons();
        }
        //刷新UI
        void RefreshUI(IList<UserVO> datas)
        {
            ClearItems();
            foreach (var data in datas)
            {
                UserList_Item item = CreateItem();
                item.UpdateData(data);
                itemList.Add(item);
            }
            txt_userCount.text = datas.Count.ToString();
        }
        //新建列表项目
        UserList_Item CreateItem()
        {
            UserList_Item item = GameObject.Instantiate<UserList_Item>(itemPrefab);
            item.transform.SetParent(itemPrefab.transform.parent);
            item.gameObject.SetActive(true);
            item.transform.localScale = Vector3.one;
            item.transform.localPosition = Vector3.zero;
    
            return item;
        }
        //清空列表
        void ClearItems()
        {
            foreach(var item in itemList)
            {
                Destroy(item.gameObject);
            }
            itemList.Clear();
        }
        //更新按钮
        private void UpdateButtons()
        {
            btn_Delete.interactable = (SelectedUserData != null);
        }
    }

    用户个人信息部分

      1 using UnityEngine;
      2 using UnityEngine.UI;
      3 using System.Collections;
      4 using UnityEngine.EventSystems;
      5 
      6 //用户个人信息表单模式?编辑:新增
      7 public enum UserFormMode
      8 {
      9     ADD,
     10     EDIT,
     11 }
     12 //用户个人信息表单
     13 public class UserForm : MonoBehaviour
     14 {
     15     //UI项的定义
     16     public InputField txt_firstName;
     17     public InputField txt_lastName;
     18     public InputField txt_email;
     19     public InputField txt_userName;
     20     public InputField txt_password;
     21     public InputField txt_confirmPassword;
     22     public InputField txt_department;
     23     public Button btn_updateUser;
     24     public Button btn_cancel;
     25 
     26     //其他
     27     public System.Action AddUser;
     28     public System.Action UpdateUser;
     29     public System.Action CancelUser;
     30 
     31     //用户信息获取
     32     public UserVO User
     33     {
     34         get { return m_user; }
     35     }
     36     private UserVO m_user;
     37 
     38     //用户信息表单
     39     public UserFormMode Mode
     40     {
     41         get { return m_mode; }
     42     }
     43     private UserFormMode m_mode = UserFormMode.ADD;
     44 
     45     //开始
     46     void Start ()
     47     {
     48         //设置UI
     49         btn_updateUser.onClick.AddListener(btn_updateUser_Click);
     50         btn_cancel.onClick.AddListener(btn_cancel_Click);
     51 
     52         txt_userName.onValueChange.AddListener(InputField_onValueChange);
     53         txt_password.onValueChange.AddListener(InputField_onValueChange);
     54         txt_confirmPassword.onValueChange.AddListener(InputField_onValueChange);
     55 
     56         UpdateButtons();
     57     }
     58 
     59     //显示当前用户信息
     60     public void ShowUser(UserVO user, UserFormMode mode)
     61     {
     62         m_mode = mode;
     63         if (user == null)
     64         {
     65             ClearForm();
     66         }
     67         else
     68         {
     69             m_user = user;
     70             txt_firstName.text = user.FirstName;
     71             txt_lastName.text = user.LastName;
     72             txt_email.text = user.Email;
     73             txt_userName.text = user.UserName;
     74             txt_password.text = txt_confirmPassword.text = user != null ? user.Password : "";
     75             txt_department.text = user.Department;
     76             //txt_firstName.ActivateInputField();
     77             EventSystem.current.SetSelectedGameObject(txt_firstName.gameObject);
     78             //txt_firstName.MoveTextEnd(false);
     79             txt_firstName.caretPosition = txt_firstName.text.Length - 1;
     80             UpdateButtons();
     81         }
     82     }
     83 
     84     //更新按钮
     85     private void UpdateButtons()
     86     {
     87         if (btn_updateUser != null)
     88         {
     89             btn_updateUser.interactable = (txt_firstName.text.Length > 0 && txt_password.text.Length > 0 && txt_password.text.Equals(txt_confirmPassword.text));
     90         }
     91     }
     92 
     93     //清空表单
     94     public void ClearForm()
     95     {
     96         m_user = null;
     97         txt_firstName.text = txt_lastName.text = txt_email.text = txt_userName.text = "";
     98         txt_password.text = txt_confirmPassword.text = "";
     99         txt_department.text = "";
    100         UpdateButtons();
    101     }
    102 
    103     //更新用户信息
    104     void btn_updateUser_Click()
    105     {
    106         m_user = new UserVO(
    107             txt_userName.text, txt_firstName.text, 
    108             txt_lastName.text, txt_email.text, 
    109             txt_password.text, txt_department.text);
    110 
    111         if (m_user.IsValid)
    112         {
    113             if (m_mode == UserFormMode.ADD)
    114             {
    115                 if (AddUser != null) AddUser();
    116             }
    117             else
    118             {
    119                 if (UpdateUser != null) UpdateUser();
    120             }
    121         }
    122     }
    123 
    124     //取消信息
    125     void btn_cancel_Click()
    126     {
    127         if (CancelUser != null) CancelUser();
    128     }
    129 
    130     //输入
    131     void InputField_onValueChange(string value)
    132     {
    133         UpdateButtons();
    134     }
    135 }

    最后,对局部更新UI的行为进行完善Mediator

     1 using UnityEngine;
     2 using System.Collections;
     3 using PureMVC.Patterns;
     4 using PureMVC.Interfaces;
     5 using System.Collections.Generic;
     6 //更新UserList部分
     7 public class UserListMediator : Mediator, IMediator
     8 {
     9     private UserProxy userProxy;
    10 
    11     public new const string NAME = "UserListMediator";
    12 
    13     private UserList View
    14     {
    15         get { return (UserList)ViewComponent; }
    16     }
    17 
    18     public UserListMediator(UserList userList)
    19             : base(NAME, userList)
    20     {
    21         Debug.Log("UserListMediator()");
    22         userList.NewUser += userList_NewUser;
    23         userList.DeleteUser += userList_DeleteUser;
    24         userList.SelectUser += userList_SelectUser;
    25     }
    26 
    27     public override void OnRegister()
    28     {
    29         Debug.Log("UserListMediator.OnRegister()");
    30         base.OnRegister();
    31         userProxy = Facade.RetrieveProxy(UserProxy.NAME) as UserProxy;
    32         View.LoadUsers(userProxy.Users);
    33     }
    34 
    35     void userList_NewUser()
    36     {
    37         UserVO user = new UserVO();
    38         SendNotification(EventsEnum.NEW_USER, user);
    39     }
    40 
    41     void userList_DeleteUser()
    42     {
    43         SendNotification(EventsEnum.DELETE_USER, View.SelectedUserData);
    44     }
    45 
    46     void userList_SelectUser()
    47     {
    48         SendNotification(EventsEnum.USER_SELECTED, View.SelectedUserData);
    49     }
    50 
    51     public override IList<string> ListNotificationInterests()
    52     {
    53         IList<string> list = new List<string>();
    54         list.Add(EventsEnum.USER_DELETED);
    55         list.Add(EventsEnum.CANCEL_SELECTED);
    56         list.Add(EventsEnum.USER_ADDED);
    57         list.Add(EventsEnum.USER_UPDATED);
    58         return list;
    59     }
    60 
    61     public override void HandleNotification(INotification notification)
    62     {
    63         switch(notification.Name)
    64         {
    65             case EventsEnum.USER_DELETED:
    66                 View.Deselect();
    67                 View.LoadUsers(userProxy.Users);
    68                 break;
    69             case EventsEnum.CANCEL_SELECTED:
    70                 View.Deselect();
    71                 break;
    72             case EventsEnum.USER_ADDED:
    73                 View.Deselect();
    74                 View.LoadUsers(userProxy.Users);
    75                 break;
    76             case EventsEnum.USER_UPDATED:
    77                 View.Deselect();
    78                 View.LoadUsers(userProxy.Users);
    79                 break;
    80         }
    81     }
    82 }
     1 using UnityEngine;
     2 using System.Collections;
     3 using PureMVC.Patterns;
     4 using PureMVC.Interfaces;
     5 using System.Collections.Generic;
     6 //更新UserForm部分
     7 public class UserFormMediator : Mediator, IMediator
     8 {
     9     private UserProxy userProxy;
    10 
    11     public new const string NAME = "UserFormMediator";
    12 
    13     private UserForm View
    14     {
    15         get { return (UserForm)ViewComponent; }
    16     }
    17 
    18     public UserFormMediator(UserForm viewComponent)
    19         : base(NAME, viewComponent)
    20     {
    21         Debug.Log("UserFormMediator()");
    22 
    23         View.AddUser += UserForm_AddUser;
    24         View.UpdateUser += UserForm_UpdateUser;
    25         View.CancelUser += UserForm_CancelUser;
    26     }
    27 
    28     public override void OnRegister()
    29     {
    30         base.OnRegister();
    31         userProxy = Facade.RetrieveProxy(UserProxy.NAME) as UserProxy;
    32     }
    33 
    34     void UserForm_AddUser()
    35     {
    36         UserVO user = View.User;
    37         userProxy.AddItem(user);
    38         SendNotification(EventsEnum.USER_ADDED, user);
    39         View.ClearForm();
    40     }
    41 
    42     void UserForm_UpdateUser()
    43     {
    44         UserVO user = View.User;
    45         userProxy.UpdateItem(user);
    46         SendNotification(EventsEnum.USER_UPDATED, user);
    47         View.ClearForm();
    48     }
    49 
    50     void UserForm_CancelUser()
    51     {
    52         SendNotification(EventsEnum.CANCEL_SELECTED);
    53         View.ClearForm();
    54     }
    55 
    56     public override IList<string> ListNotificationInterests()
    57     {
    58         IList<string> list = new List<string>();
    59         list.Add(EventsEnum.NEW_USER);
    60         list.Add(EventsEnum.USER_DELETED);
    61         list.Add(EventsEnum.USER_SELECTED);
    62         return list;
    63     }
    64 
    65     public override void HandleNotification(INotification note)
    66     {
    67         UserVO user;
    68         switch (note.Name)
    69         {
    70             case EventsEnum.NEW_USER:
    71                 user = (UserVO)note.Body;
    72                 View.ShowUser(user, UserFormMode.ADD);
    73                 break;
    74 
    75             case EventsEnum.USER_DELETED:
    76                 View.ClearForm();
    77                 break;
    78 
    79             case EventsEnum.USER_SELECTED:
    80                 user = (UserVO)note.Body;
    81                 View.ShowUser(user, UserFormMode.EDIT);
    82                 break;
    83 
    84         }
    85     }
    86 }

    补充,UI的选择部分

     1 using UnityEngine;
     2 using UnityEngine.UI;
     3 using System.Collections;
     4 
     5 [RequireComponent(typeof(Toggle))]
     6 public class UGUI_MyToggle : MonoBehaviour
     7 {    
     8     [SerializeField]Toggle toggle;
     9     [SerializeField]UGUI_MyToggleGroup myToggleGroup;
    10 
    11     void Start()
    12     {
    13         if (toggle == null) toggle = this.GetComponent<Toggle>();
    14         if (myToggleGroup == null) myToggleGroup = toggle.group.GetComponent<UGUI_MyToggleGroup>();
    15 
    16         toggle.onValueChanged.AddListener(onToggle);
    17     }
    18 
    19     void onToggle(bool value)
    20     {
    21         if(value)
    22         {
    23             myToggleGroup.ChangeToggle(toggle);
    24         }
    25     }
    26 }

    原文地址:http://www.jianshu.com/p/904b36ad37e2

  • 相关阅读:
    线段树的区间更新---A Simple Problem with Integers
    划分树---Feed the dogs
    划分树基础知识
    Treap树的基础知识
    平衡二叉树---Shaolin
    KMA & ex_KMP---Revolving Digits
    DP---Mahjong tree
    《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量
    《程序员代码面试指南》第一章 栈和队列 求最大子矩阵大小
    《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/7056663.html
Copyright © 2011-2022 走看看