|
|
@@ -57,46 +57,7 @@
|
|
|
}
|
|
|
|
|
|
- (id)propertyOrIvarValue:(id)object {
|
|
|
- BOOL objectIsInstance = !object_isClass(object);
|
|
|
-
|
|
|
- // We use -[FLEXObjectExplorer valueFor...:] instead of getValue: below
|
|
|
- // because we want to "preview" what object is being stored if this is
|
|
|
- // a void * or something and we're given an NSValue back from getValue:
|
|
|
- switch (self.metadataKind) {
|
|
|
- case FLEXMetadataKindProperties:
|
|
|
- case FLEXMetadataKindClassProperties: {
|
|
|
- // Decide whether to use object or [object class] to check for a potential value
|
|
|
- id targetForValueCheck = nil;
|
|
|
- if (objectIsInstance) {
|
|
|
- if (self.property.isClassProperty) {
|
|
|
- targetForValueCheck = [object class];
|
|
|
- } else {
|
|
|
- targetForValueCheck = object;
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (self.property.isClassProperty) {
|
|
|
- targetForValueCheck = object;
|
|
|
- } else {
|
|
|
- // Instance property with a class object
|
|
|
- return nil;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return [self.property getPotentiallyUnboxedValue:targetForValueCheck];
|
|
|
- }
|
|
|
- case FLEXMetadataKindIvars: {
|
|
|
- if (objectIsInstance) {
|
|
|
- return [self.ivar getPotentiallyUnboxedValue:object];
|
|
|
- }
|
|
|
-
|
|
|
- return nil;
|
|
|
- }
|
|
|
-
|
|
|
- // Methods: nil
|
|
|
- case FLEXMetadataKindMethods:
|
|
|
- case FLEXMetadataKindClassMethods:
|
|
|
- return nil;
|
|
|
- }
|
|
|
+ return [self.metadata currentValueWithTarget:object];
|
|
|
}
|
|
|
|
|
|
- (NSString *)titleWith:(id)object {
|
|
|
@@ -105,99 +66,38 @@
|
|
|
case FLEXMetadataKindProperties:
|
|
|
// Since we're outside of the "properties" section, prepend @property for clarity.
|
|
|
return [@"@property " stringByAppendingString:[_item description]];
|
|
|
- case FLEXMetadataKindIvars:
|
|
|
- case FLEXMetadataKindMethods:
|
|
|
- return [_item description];
|
|
|
|
|
|
default:
|
|
|
- break;
|
|
|
+ return [_item description];
|
|
|
}
|
|
|
|
|
|
- if ([_item isKindOfClass:[NSString class]]) {
|
|
|
- return _item;
|
|
|
- }
|
|
|
+ NSAssert(
|
|
|
+ [_item isKindOfClass:[NSString class]],
|
|
|
+ @"Unexpected type: %@", [_item class]
|
|
|
+ );
|
|
|
|
|
|
- [NSException
|
|
|
- raise:NSInvalidArgumentException
|
|
|
- format:@"Unsupported shortcut '%@':\n%@",
|
|
|
- [_item class], [_item description]
|
|
|
- ];
|
|
|
- return nil;
|
|
|
+ return _item;
|
|
|
}
|
|
|
|
|
|
-- (NSString *)subtitleWith:(id)fromObject {
|
|
|
- switch (self.metadataKind) {
|
|
|
- case FLEXMetadataKindProperties:
|
|
|
- case FLEXMetadataKindIvars:
|
|
|
- return [FLEXRuntimeUtility
|
|
|
- summaryForObject:[self propertyOrIvarValue:fromObject]
|
|
|
- ];
|
|
|
- case FLEXMetadataKindMethods:
|
|
|
- case FLEXMetadataKindClassMethods:
|
|
|
- return [_item selectorString];
|
|
|
-
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if ([_item isKindOfClass:[NSString class]]) {
|
|
|
- // Must return empty string since these will be
|
|
|
- // gathered into an array. If the object is a
|
|
|
- // just a string, it doesn't get a subtitle.
|
|
|
- return @"";
|
|
|
+- (NSString *)subtitleWith:(id)object {
|
|
|
+ if (self.metadataKind) {
|
|
|
+ return [self.metadata previewWithTarget:object];
|
|
|
}
|
|
|
|
|
|
- [NSException
|
|
|
- raise:NSInvalidArgumentException
|
|
|
- format:@"Unsupported shortcut '%@':\n%@",
|
|
|
- [_item class], [_item description]
|
|
|
- ];
|
|
|
- return nil;
|
|
|
+ // Item is probably a string; must return empty string since
|
|
|
+ // these will be gathered into an array. If the object is a
|
|
|
+ // just a string, it doesn't get a subtitle.
|
|
|
+ return @"";
|
|
|
}
|
|
|
|
|
|
- (UIViewController *)viewerWith:(id)object {
|
|
|
- // View or edit a property or ivar
|
|
|
- switch (self.metadataKind) {
|
|
|
- case FLEXMetadataKindProperties:
|
|
|
- case FLEXMetadataKindIvars:
|
|
|
- return [FLEXObjectExplorerFactory
|
|
|
- explorerViewControllerForObject:[self propertyOrIvarValue:object]
|
|
|
- ];
|
|
|
- case FLEXMetadataKindMethods:
|
|
|
- case FLEXMetadataKindClassMethods:
|
|
|
- object = self.method.isInstanceMethod ? object : (object_isClass(object) ? object : [object class]);
|
|
|
- return [FLEXMethodCallingViewController target:object method:self.method];
|
|
|
-
|
|
|
- default:
|
|
|
- return nil;
|
|
|
- }
|
|
|
-
|
|
|
- return nil;
|
|
|
+ NSAssert(self.metadataKind, @"Static titles cannot be viewed");
|
|
|
+ return [self.metadata viewerWithTarget:object];
|
|
|
}
|
|
|
|
|
|
- (UIViewController *)editorWith:(id)object {
|
|
|
- BOOL objectIsInstance = !object_isClass(object);
|
|
|
- switch (self.metadataKind) {
|
|
|
- case FLEXMetadataKindProperties:
|
|
|
- NSAssert(objectIsInstance, @"Unreachable state: class object editing instance property");
|
|
|
- return [FLEXFieldEditorViewController target:object property:self.property];
|
|
|
- case FLEXMetadataKindClassProperties:
|
|
|
- if (objectIsInstance) {
|
|
|
- return [FLEXFieldEditorViewController target:[object class] property:self.property];
|
|
|
- } else {
|
|
|
- return [FLEXFieldEditorViewController target:object property:self.property];
|
|
|
- }
|
|
|
- case FLEXMetadataKindIvars:
|
|
|
- NSAssert(objectIsInstance, @"Unreachable state: class object editing ivar");
|
|
|
- return [FLEXFieldEditorViewController target:object ivar:self.ivar];
|
|
|
-
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- // Methods can't be edited
|
|
|
- @throw NSInternalInconsistencyException;
|
|
|
- return nil;
|
|
|
+ NSAssert(self.metadataKind, @"Static titles cannot be edited");
|
|
|
+ return [self.metadata editorWithTarget:object];
|
|
|
}
|
|
|
|
|
|
- (UITableViewCellAccessoryType)accessoryTypeWith:(id)object {
|