# 操作安全性

# 加载自定义控件失败

如果自定义控控件所在的文件中不存在该自定义控件,或者该文件不合法(不符合json格式,缺少根节点下缺少"namespace"节点)就会导致该报错的产生。

# 无法删除当前编辑的自定义控件

当前正在编辑的自定义控件是不允许进行删除的。

# UI名字已经被系统或原生使用

在MC中已经存在了部分原生控件,并且占用了一定的命名空间,用户应当用其他名称命名UI文件

# 继承循环错误

当前正在编辑自定义控件的时候,当控件继承关系比较复杂的时候,比较难察觉到继承导致的循环错误,比如三个控件 A,B,C,如果继承关系为 B继承自A,C继承自B,那么在编辑A的时候,如果将在A中实例化C并且保存到A中,那么就会间接导致自定义控件C所继承的对象中包含自己,从而导致在实例化C的时候,会出现循环错误。

# 包含循环错误

当前正在编辑自定义控件的时候,当控件继承关系以及包含关系比较复杂的时候,容易导致这个包含循环错误,比如三个 A,B,C,如果继承关系为B继承自C,如果C中包含了一个继承自A的子节点,在B不改写自身子节点的情况时,相当于B也包含了一个继承自A的子节点,如果此时用户编辑的是自定义控件A,对B实例化在A中的时候,就会间接导致自定义控件A中包含了继承自自定义控件A的节点,从而导致循环错误。

# 添加变量失败

用户尝试更新的变量为全局变量或者是UI编辑器暂时不支持的变量类型,比如 "$variable_1": "$variable_2" 这类变量引用变量的情况,则会导致该报错

# 更新变量失败

报错原因见添加变量失败

# 丢失引用导致的变量无法解析

比如一个image类型的控件,基础属性 "alpha" 引用了变量 "$myAlpha",并且该变量是声明在他的父组件,那么在将该image控件创建为自定义控件的时候,"$myAlpha"变量是不存在于该自定义控件上的(假设该控件身上也没有声明 "$myAlpha|default"变量),因此在实例该自定义控件的时候,他的实例一开始也是不包含该变量的,如果将这个实例挂载到一个不含有"$myAlpha"变量的父节点树下,那么将会导致该实例在解析属性 "alpha" 的时候搜索不到 "$myAlpha"变量而报解析错误。

同样,如果一个控件为万用控件,它继承的控件是由变量解析的,如果搜索不到变量则解析不了它所继承的对象,从而导致它变为一个破损控件。

因此,用户在删除变量以及创建自定义控件过程中,都会提示用户该潜在的风险。

# 变量循环

在更改万用控件所继承的变量值的时候,会对变量值所对应的自定义控件进行解析生成,假设一种情况,万用控件A继承自变量 "$myCustomControl",并且值为 "myNamespace.myCustomControl",也就是A继承了自定义控件 myCustomControl,如果这个自定义控件恰好里面也包含一个继承自变量 "$myCustomControl"的万用控件,并且该万用控件的这个变量也被解析为 "myNamespace.myCustomControl",那么此时就会造成变量循环,在解析继承控件的时候会不断进行循环变量的解析。