cocos creator从零开发简单框架(07)-UI返回
参考UIMain
,创建一个新的UIBag
,创建一个名为BtnBack
文本为返回
的按钮,再创建一个名为BtnMain
文本为主页
的按钮,然后把 UIBag
节点拖动到resources
目录下并从场景删除。
新建scripts/UIBag.ts
,内容如下。
import UIBase from "../framework/scripts/view/UIBase"
import UIMgr from "../framework/scripts/view/UIMgr"
import UIMain from "./UIMain"
export default class UIBag extends UIBase {
public skinPath: string = 'UIBag'
protected onButtonClick(button: cc.Node) {
switch (button.name) {
case 'BtnBack':
UIMgr.open(UIMain)
break
case 'BtnMain':
UIMgr.open(UIMain)
break
}
}
}
编辑scripts/UIMain.ts
,onButtonClick
方法修改后如下。
protected onButtonClick(button: cc.Node) {
switch (button.name) {
case 'BtnUIBag':
UIMgr.open(UIBag)
break
}
}
运行程序,点击背包
按钮,现在已经切换到了UIBag
界面。
此时点击返回
按钮,又切换到了UIMain
界面。虽然在这里调用UIMgr.open
能够返回到上一个UI
,但实际应用中某个UI
会从很多地方切换过来,如果再用open
这个接口就不方便了。所以添加一个back
接口并用一个堆栈数据记录打开过的UI
,切换时候把UI
推入栈,返回时显示上一个UI
,当换到主页的时候就清空这个数据。
编辑framework/scripts/view/UIMgr.ts
,在顶部import
下面定义UI
堆栈记录。
class UIOpen {
constructor(public uiCls: any, public args: any[]) { }
}
添加堆栈记录相关成员并添加init
方法。
private static _current: UIBase
// 主UI(进入主UI时会清空当前打开的所有UI记录)
private static _uiMain: string
// UI 打开记录
private static _uiOpens: UIOpen[] = []
public static init(uiMain: string) {
this._uiMain = uiMain
this._uiOpens = []
}
修改open
方法,插入UI
记录,并处理主UI
相关逻辑。
public static open(uiCls: any, ...uiArgs: any[]) {
const cls = new uiCls() as UIBase
const viewName = cls.getClassName()
if (this._current && this._current.uiName == viewName) {
console.error(`UIMgr.open 已在当前UI:${viewName}`)
return
}
// 进入主 UI, 把 UI 打开记录清空
if (this._uiMain == viewName) {
this._uiOpens = []
}
this._uiOpens.push(new UIOpen(uiCls, uiArgs))
this.show(cls, uiArgs)
}
添加back
方法,用于UI
回退处理。
/**
* 回退至上一个 UI
* @returns
*/
public static back() {
if (this._uiOpens.length < 2) {
console.error('UIMgr.back 切换至上一个场景时, 没有上一个场景记录, 请检查逻辑')
return
}
const prev = this._uiOpens[this._uiOpens.length - 2] //上一个 UI
this._uiOpens.splice(this._uiOpens.length - 2, 2) //切换至上一个 UI 后, 清除最后一个 UI (即当前UI) 和上一 UI
this.open(prev.uiCls, prev.args)
}
编辑framework/scripts/App.ts
,添加 主UI
名称成员、修改init
和initFramework
方法。
// 主UI(进入主UI时会清空当前打开的所有UI记录)
private static _uiMain: string = 'UIMain'
// 初始化
public static init(uiMain?: string) {
if (uiMain) this._uiMain = uiMain
this.initFramework()
}
// 递归显示节点信息
// ...... 省略代码 ......
// 初始化框架
private static initFramework() {
LayerMgr.init()
UIMgr.init(this._uiMain)
}
编辑scripts/UIBag.ts
, onButtonClick
方法修改后如下。
protected onButtonClick(button: cc.Node) {
switch (button.name) {
case 'BtnBack':
UIMgr.back()
break
case 'BtnMain':
UIMgr.open(UIMain)
break
}
}
运行程序,点击背包
按钮进入UIBag
界面后再点击返回
按钮可以返回到UIMain
界面了。
本作品采用《CC 协议》,转载必须注明作者和本文链接