using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace IcecreamView { [DisallowMultipleComponent, System.Serializable] public abstract class IC_AbstractView : MonoBehaviour { #if UNITY_EDITOR public bool HasAutoCreate = true; #endif /// /// ViewTable标识 不能修改 /// [HideInInspector] public string VIEWTABLE; internal string _group; internal int _configID; internal int openCount; internal int CurSortOrder; [SerializeField ,Tooltip("是否可被聚焦")] internal bool hasFocusView = true; internal int _focusID; internal bool CurFocusState; internal Action onOpened; internal Action onClosed; /// /// 用于判断页面是否开启 /// [HideInInspector] public bool isOpen = false; [HideInInspector] public bool isOnce = false; [SerializeField] internal int DefaultStory; public int PanelLayer => DefaultStory; public bool HasFocusView => hasFocusView; public string Group => this._group; public RectTransform ViewRectTransform { get; protected set; } /// /// 对应View管理器 /// [System.NonSerialized] protected IC_Controller viewManager; internal void SetViewManager(IC_Controller viewManager) { if (this.viewManager == null) { this.viewManager = viewManager; } } public void SendEvent(int code , params object[] value) { this.viewManager.EventManager.SendEvent(code , value); } /// /// 页面被创建初始化时触发该方法 /// internal virtual void OnInitView () { this.ViewRectTransform = (RectTransform)this.transform; } /// /// 页面打开时触发该方法 /// internal virtual void OnOpenView(params IC_ViewData[] values) { } /// /// 页面被关闭前触发该方法 /// internal virtual void OnCloseView() { } /// /// 强制关闭页面时触发该方法 /// internal virtual void OnHardCloseView() { } /// /// 页面被彻底销毁时触发 /// internal virtual void OnDestroyView() { } internal virtual void OnFocus(bool isFocus) { } /// /// 关闭当前页面 /// public void CloseView() { viewManager.CloseViewFromView(this); } /// /// 用于截断页面关闭的钩子方法,默认返回true,如果返回false转为手动模式,需要自行close页面,适用于各种骚操作,请谨慎使用,可能会引起未知错误 /// /// internal virtual bool _closeHook() { return true; } /// /// 直接关闭页面,通常情况下请使用CloseView方法,直接使用该方法可能导致不稳定出现位置问题 /// internal void _directClose() { OnClosed (); if (isOnce) { viewManager.DestroyViewAtHash(gameObject.GetHashCode()); } else { gameObject.SetActive(false); transform.SetAsFirstSibling(); } this.viewManager.UpdateFocusView (); this.viewManager.OnViewClosed?.Invoke(this); } /// /// 打开指定页面 /// /// 页面table /// 是否同时关闭自己 public IC_AbstractView OpenView(string ViewTable, bool isCloseThis = false, bool isSinge = true , params IC_ViewData[] values) { if (viewManager != null) { if (isCloseThis) { CloseView(); } return viewManager.OpenView(ViewTable, isSinge, values); } return null; } public IC_AbstractView OpenView(string ViewTable, bool isCloseThis = false, params IC_ViewData[] values) { return OpenView(ViewTable , isCloseThis , true , values); } public IC_AbstractView OpenView(string ViewTable, params IC_ViewData[] values) { return OpenView(ViewTable , false , true , values); } private void OnDestroy() { this.OnDestroyView(); } // ReSharper disable Unity.PerformanceAnalysis protected void OnOpened () { var opened = this.onOpened; this.onOpened = null; opened?.Invoke (); } protected void OnClosed () { var closed = this.onClosed; this.onClosed = null; closed?.Invoke (); } } }