FLEXObjectExplorerFactory.m 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //
  2. // FLEXObjectExplorerFactory.m
  3. // Flipboard
  4. //
  5. // Created by Ryan Olson on 5/15/14.
  6. // Copyright (c) 2014 Flipboard. All rights reserved.
  7. //
  8. #import "FLEXObjectExplorerFactory.h"
  9. #import "FLEXObjectExplorerViewController.h"
  10. #import "FLEXArrayExplorerViewController.h"
  11. #import "FLEXSetExplorerViewController.h"
  12. #import "FLEXDictionaryExplorerViewController.h"
  13. #import "FLEXDefaultsExplorerViewController.h"
  14. #import "FLEXViewControllerExplorerViewController.h"
  15. #import "FLEXViewExplorerViewController.h"
  16. #import "FLEXImageExplorerViewController.h"
  17. #import "FLEXClassExplorerViewController.h"
  18. #import "FLEXLayerExplorerViewController.h"
  19. #import "FLEXColorExplorerViewController.h"
  20. #import "FLEXBundleExplorerViewController.h"
  21. #import "FLEXGlobalsTableViewController.h"
  22. #import "FLEXAlert.h"
  23. #import <objc/runtime.h>
  24. @implementation FLEXObjectExplorerFactory
  25. + (FLEXObjectExplorerViewController *)explorerViewControllerForObject:(id)object
  26. {
  27. // Bail for nil object. We can't explore nil.
  28. if (!object) {
  29. return nil;
  30. }
  31. static NSDictionary<NSString *, Class> *explorerSubclassesForObjectTypeStrings = nil;
  32. static dispatch_once_t once;
  33. dispatch_once(&once, ^{
  34. explorerSubclassesForObjectTypeStrings = @{NSStringFromClass([NSArray class]) : [FLEXArrayExplorerViewController class],
  35. NSStringFromClass([NSSet class]) : [FLEXSetExplorerViewController class],
  36. NSStringFromClass([NSDictionary class]) : [FLEXDictionaryExplorerViewController class],
  37. NSStringFromClass([NSUserDefaults class]) : [FLEXDefaultsExplorerViewController class],
  38. NSStringFromClass([UIViewController class]) : [FLEXViewControllerExplorerViewController class],
  39. NSStringFromClass([UIView class]) : [FLEXViewExplorerViewController class],
  40. NSStringFromClass([UIImage class]) : [FLEXImageExplorerViewController class],
  41. NSStringFromClass([CALayer class]) : [FLEXLayerExplorerViewController class],
  42. NSStringFromClass([UIColor class]) : [FLEXColorExplorerViewController class],
  43. NSStringFromClass([NSBundle class]) : [FLEXBundleExplorerViewController class],
  44. };
  45. });
  46. Class explorerClass = nil;
  47. BOOL objectIsClass = class_isMetaClass(object_getClass(object));
  48. if (objectIsClass) {
  49. explorerClass = [FLEXClassExplorerViewController class];
  50. } else {
  51. explorerClass = [FLEXObjectExplorerViewController class];
  52. for (NSString *objectTypeString in explorerSubclassesForObjectTypeStrings) {
  53. Class objectClass = NSClassFromString(objectTypeString);
  54. if ([object isKindOfClass:objectClass]) {
  55. explorerClass = explorerSubclassesForObjectTypeStrings[objectTypeString];
  56. break;
  57. }
  58. }
  59. }
  60. FLEXObjectExplorerViewController *explorerViewController = [explorerClass new];
  61. explorerViewController.object = object;
  62. return explorerViewController;
  63. }
  64. #pragma mark - FLEXGlobalsEntry
  65. + (NSString *)globalsEntryTitle:(FLEXGlobalsRow)row
  66. {
  67. switch (row) {
  68. case FLEXGlobalsRowAppDelegate:
  69. return @"👉 App delegate";
  70. case FLEXGlobalsRowRootViewController:
  71. return @"🌴 Root view controller";
  72. case FLEXGlobalsRowProcessInfo:
  73. return @"🚦 NSProcessInfo.processInfo";
  74. case FLEXGlobalsRowUserDefaults:
  75. return @"💾 Preferences (NSUserDefaults)";
  76. case FLEXGlobalsRowMainBundle:
  77. return @"📦 NSBundle.mainBundle";
  78. case FLEXGlobalsRowApplication:
  79. return @"🚀 UIApplication.sharedApplication";
  80. case FLEXGlobalsRowMainScreen:
  81. return @"💻 UIScreen.mainScreen";
  82. case FLEXGlobalsRowCurrentDevice:
  83. return @"📱 UIDevice.currentDevice";
  84. case FLEXGlobalsRowPasteboard:
  85. return @"📋 UIPasteboard.generalPasteboard";
  86. default: return nil;
  87. }
  88. }
  89. + (UIViewController *)globalsEntryViewController:(FLEXGlobalsRow)row
  90. {
  91. switch (row) {
  92. case FLEXGlobalsRowAppDelegate: {
  93. id<UIApplicationDelegate> appDelegate = UIApplication.sharedApplication.delegate;
  94. return [self explorerViewControllerForObject:appDelegate];
  95. }
  96. case FLEXGlobalsRowProcessInfo:
  97. return [self explorerViewControllerForObject:NSProcessInfo.processInfo];
  98. case FLEXGlobalsRowUserDefaults:
  99. return [self explorerViewControllerForObject:NSUserDefaults.standardUserDefaults];
  100. case FLEXGlobalsRowMainBundle:
  101. return [self explorerViewControllerForObject:NSBundle.mainBundle];
  102. case FLEXGlobalsRowApplication:
  103. return [self explorerViewControllerForObject:UIApplication.sharedApplication];
  104. case FLEXGlobalsRowMainScreen:
  105. return [self explorerViewControllerForObject:UIScreen.mainScreen];
  106. case FLEXGlobalsRowCurrentDevice:
  107. return [self explorerViewControllerForObject:UIDevice.currentDevice];
  108. case FLEXGlobalsRowPasteboard:
  109. return [self explorerViewControllerForObject:UIPasteboard.generalPasteboard];
  110. case FLEXGlobalsRowRootViewController:
  111. return [self explorerViewControllerForObject:UIApplication.sharedApplication.delegate.window.rootViewController];
  112. default: return nil;
  113. }
  114. }
  115. @end