如何解决当属性是列表时,如何在 PropertyDrawer 上实现 ReorderableList
我创建了一个 ForceCaseAttribute
,它计划处理字符串数组、字符串列表以及普通字符串,但是我似乎无法弄清楚如何正确显示我当前的 ReorderableList
抽屉代码如下
public override void OnGUI ( Rect position,SerializedProperty property,GUIContent label ) {
ForceCaseAttribute fca = attribute as ForceCaseAttribute;
ReorderableList list = new ReorderableList ( property.serializedobject,property,true,true );
list.drawHeaderCallback = ( Rect rect ) => {
EditorGUI.LabelField ( rect,label );
};
list.drawElementCallback = ( Rect rect,int index,bool isActive,bool isFocused ) => {
SerializedProperty element = list.serializedProperty.GetArrayElementAtIndex ( index );
string e = element.stringValue;
e = EditorGUI.TextField ( rect,e );
element.stringValue = fca.LetterCase == LetterCase.Lower ? e.ToLower () : fca.LetterCase == LetterCase.Upper ? e.toupper () : fca.LetterCase == LetterCase.Pascal ? Pascal ( e ) : Pascal ( e.Split ( new char [] { ' ' } ) );
};
list.DoLayoutList ();
}
但它在检查器中显示为这个
每个标有 Element # 的字段都不能添加到初始列表中,并且它们都以初始列表为父级,并且这些都不会引发任何错误。为了能够纠正这个问题,我是否遗漏了一些重要的步骤?
解决方法
短暂休息后,我回来尝试了一些不寻常的事情。事实证明,如果您将一个属性放在 List 或字符串数组之前,然后尝试为该属性创建一个属性抽屉,它会为单个元素创建一个属性抽屉并将其应用于每个元素。我不确定为什么会发生这种情况,但确实有效。
public override void OnGUI ( Rect position,SerializedProperty property,GUIContent label ) {
ForceCaseAttribute fca = attribute as ForceCaseAttribute;
string e = property.stringValue;
e = EditorGUI.TextField ( position,label,e );
property.stringValue = fca.LetterCase == LetterCase.Lower ? e.ToLower () : fca.LetterCase == LetterCase.Upper ? e.ToUpper () : fca.LetterCase == LetterCase.Pascal ? Pascal ( e ) : Pascal ( e.Split ( new char [] { ' ' } ) );
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。