bugfix #230: Interface Builder: CGPoint/CGSize/CGRect/NSRange are not supported, wrong obj-c class name for empty @CustomClass()
03 Nov 2017 | fix interface builderHistory IB integrator generates wrong class name for empty @CustomClass, doesn’t support structs in IBInspectable
Fix PR231
Have discovered that User define attributes/UIInspectable are not handled correctly: XCode project is not generated, if just added in code bypassing IB – values are not set in case of field outlets. Structs that causes problem:
- CGPoint
- CGSize
- CGRect
- NSRange
Part zero: Wrong class name
Was under impression that empty value in @CustomClass
will generated iOS class with simpleClassName() but that was wrong, runtime generates it as bellow:
//ObjCClass.java
private static String getCustomClassName(Class<? extends ObjCObject> type) {
CustomClass customClassAnno = type.getAnnotation(CustomClass.class);
String name = type.getName();
if (customClassAnno != null && customClassAnno.value().length() > 0) {
name = customClassAnno.value();
} else {
name = CUSTOM_CLASS_NAME_PREFIX + name;
}
name = name.replace('.', '_');
return name;
}
To make IB generator compatible it was fixed. But as for me it would be nice to generate simpleClassName() instead of fully qualified one, as it is more user friendly
Part one: Interface builder
Fix of this part is straight forward, just added code to support these structs, check PR231
Part two: Compiler
Tricky part that outlets declared through setters work. Broken field one. Time ago outlet declaration on fields were added by me in this pr. When it was added there was outlet support through methods implemented. And to implement support for field I did a trick: synthesized java setter during SOOT path. And after that allowed existing code to transform this method into outlet property callback. The fix is to annotate parameter with @ByVal
for struct setters during that run. Check changes in ObjCMemberPlugin.transformIBOutletFieldToSetters
Comments