UI初始化两种方法差异及子对话框创建问题排查
两种子对话框初始化方法的差异分析
方法1(延迟显示)符合预期的原因
方法1中,MySub类仅通过Init方法完成UI结构的初始化,没有在类内部调用任何显示对话框的方法。子对话框的显示逻辑完全交由主对话框的按钮点击事件触发:
- 脚本启动时,仅创建
MySub对象并初始化UI结构,但不会弹出对话框 - 只有用户点击主对话框的「Options」按钮时,才调用
SubDialog.Pose()触发子对话框显示
关键逻辑代码:
// MySub类仅初始化UI,不主动显示 Object Init(Object self) { TagGroup DLGitems = DLGCreateDialog("Sub") TagGroup RadioList=DLGCreateRadioList() RadioList.DLGAddRadioItem("option 1",1) RadioList.DLGAddRadioItem("option 2",2) RadioList.DLGAddRadioItem("option 3",3) DLGitems.DLGAddElement(RadioList) Return self.super.Init(DLGitems) } // 主对话框按钮事件触发子对话框显示 Void CallSubDialog(Object self) { Result("\nOpen sub-dialog.") SubDialog.Pose() // 点击按钮才执行显示 self.LookUpElement("Label").DLGTitle("option chosen") }
方法2(构造函数立即创建)弹窗异常的原因
方法2的核心问题在于MySub的构造函数中直接调用了self.Display("MySubUI"):
- DM脚本中,调用
Alloc(MySub)创建类实例时,会自动执行构造函数(MySub(Object self)) - 构造函数里的
Display方法会立即弹出子对话框,完全跳过了按钮点击的触发条件,导致脚本一运行就弹出子对话框
关键错误逻辑代码:
// 构造函数中直接显示对话框,创建对象时就执行 MySub(Object self) { self.init(self.gen_MySubUI_dlg()) self.Display("MySubUI") // Alloc时立即触发弹窗 }
第三个示例的异常排查
第三个示例的问题是临时对象被垃圾回收机制立即销毁:
- 在
CallSubDialog方法中,Alloc(MySub)创建了MySub对象,构造函数触发对话框显示,但这个对象没有被任何变量(比如SubDialog成员)持有引用 - DM的垃圾回收(GC)会自动清理无引用的临时对象,导致子对话框刚显示就被销毁,表现为对话框一闪而过或直接抛出异常
修复方案:将创建的对象赋值给成员变量,保持引用避免被GC回收:
Void CallSubDialog(Object self) { Result("\nOpen sub-dialog.") SubDialog = Alloc(MySub) // 将对象赋值给成员变量,持有引用 }
内容的提问来源于stack exchange,提问作者ChenZX
相关产品推荐
相关产品推荐

