Quellcode durchsuchen

Organize ObjectExplorers/

- Group classes into folders (Views, Controllers)
- Add FLEXTableViewCell, FLEXSubtitleTableViewCell
- FLEXMultilineTableViewCell inherits from FLEXTableViewCell
- FLEXTableViewCell makes it easy to add custom UIMenuItem commands to any cell without subclassing it or exposing any state to it
Tanner Bennett vor 7 Jahren
Ursprung
Commit
d6caab29dc
33 geänderte Dateien mit 263 neuen und 34 gelöschten Zeilen
  1. 0 0
      Classes/ObjectExplorers/Controllers/FLEXArrayExplorerViewController.h
  2. 0 0
      Classes/ObjectExplorers/Controllers/FLEXArrayExplorerViewController.m
  3. 0 0
      Classes/ObjectExplorers/Controllers/FLEXClassExplorerViewController.h
  4. 0 0
      Classes/ObjectExplorers/Controllers/FLEXClassExplorerViewController.m
  5. 0 0
      Classes/ObjectExplorers/Controllers/FLEXColorExplorerViewController.h
  6. 0 0
      Classes/ObjectExplorers/Controllers/FLEXColorExplorerViewController.m
  7. 0 0
      Classes/ObjectExplorers/Controllers/FLEXDefaultsExplorerViewController.h
  8. 0 0
      Classes/ObjectExplorers/Controllers/FLEXDefaultsExplorerViewController.m
  9. 0 0
      Classes/ObjectExplorers/Controllers/FLEXDictionaryExplorerViewController.h
  10. 0 0
      Classes/ObjectExplorers/Controllers/FLEXDictionaryExplorerViewController.m
  11. 0 0
      Classes/ObjectExplorers/Controllers/FLEXGlobalsTableViewControllerEntry.h
  12. 0 0
      Classes/ObjectExplorers/Controllers/FLEXGlobalsTableViewControllerEntry.m
  13. 0 0
      Classes/ObjectExplorers/Controllers/FLEXImageExplorerViewController.h
  14. 0 0
      Classes/ObjectExplorers/Controllers/FLEXImageExplorerViewController.m
  15. 0 0
      Classes/ObjectExplorers/Controllers/FLEXLayerExplorerViewController.h
  16. 0 0
      Classes/ObjectExplorers/Controllers/FLEXLayerExplorerViewController.m
  17. 0 0
      Classes/ObjectExplorers/Controllers/FLEXObjectExplorerViewController.h
  18. 0 0
      Classes/ObjectExplorers/Controllers/FLEXObjectExplorerViewController.m
  19. 0 0
      Classes/ObjectExplorers/Controllers/FLEXSetExplorerViewController.h
  20. 0 0
      Classes/ObjectExplorers/Controllers/FLEXSetExplorerViewController.m
  21. 0 0
      Classes/ObjectExplorers/Controllers/FLEXViewControllerExplorerViewController.h
  22. 0 0
      Classes/ObjectExplorers/Controllers/FLEXViewControllerExplorerViewController.m
  23. 0 0
      Classes/ObjectExplorers/Controllers/FLEXViewExplorerViewController.h
  24. 0 0
      Classes/ObjectExplorers/Controllers/FLEXViewExplorerViewController.m
  25. 2 2
      Classes/Utility/FLEXMultilineTableViewCell.h
  26. 0 0
      Classes/ObjectExplorers/Views/FLEXMultilineTableViewCell.m
  27. 17 0
      Classes/ObjectExplorers/Views/FLEXSubtitleTableViewCell.h
  28. 18 0
      Classes/ObjectExplorers/Views/FLEXSubtitleTableViewCell.m
  29. 17 0
      Classes/ObjectExplorers/Views/FLEXTableView.h
  30. 47 0
      Classes/ObjectExplorers/Views/FLEXTableView.m
  31. 13 0
      Classes/ObjectExplorers/Views/FLEXTableViewCell.h
  32. 77 0
      Classes/ObjectExplorers/Views/FLEXTableViewCell.m
  33. 72 32
      FLEX.xcodeproj/project.pbxproj

Classes/ObjectExplorers/FLEXArrayExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXArrayExplorerViewController.h


Classes/ObjectExplorers/FLEXArrayExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXArrayExplorerViewController.m


Classes/ObjectExplorers/FLEXClassExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXClassExplorerViewController.h


Classes/ObjectExplorers/FLEXClassExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXClassExplorerViewController.m


Classes/ObjectExplorers/FLEXColorExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXColorExplorerViewController.h


Classes/ObjectExplorers/FLEXColorExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXColorExplorerViewController.m


Classes/ObjectExplorers/FLEXDefaultsExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXDefaultsExplorerViewController.h


Classes/ObjectExplorers/FLEXDefaultsExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXDefaultsExplorerViewController.m


Classes/ObjectExplorers/FLEXDictionaryExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXDictionaryExplorerViewController.h


Classes/ObjectExplorers/FLEXDictionaryExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXDictionaryExplorerViewController.m


Classes/ObjectExplorers/FLEXGlobalsTableViewControllerEntry.h → Classes/ObjectExplorers/Controllers/FLEXGlobalsTableViewControllerEntry.h


Classes/ObjectExplorers/FLEXGlobalsTableViewControllerEntry.m → Classes/ObjectExplorers/Controllers/FLEXGlobalsTableViewControllerEntry.m


Classes/ObjectExplorers/FLEXImageExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXImageExplorerViewController.h


Classes/ObjectExplorers/FLEXImageExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXImageExplorerViewController.m


Classes/ObjectExplorers/FLEXLayerExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXLayerExplorerViewController.h


Classes/ObjectExplorers/FLEXLayerExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXLayerExplorerViewController.m


Classes/ObjectExplorers/FLEXObjectExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXObjectExplorerViewController.h


Classes/ObjectExplorers/FLEXObjectExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXObjectExplorerViewController.m


Classes/ObjectExplorers/FLEXSetExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXSetExplorerViewController.h


Classes/ObjectExplorers/FLEXSetExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXSetExplorerViewController.m


Classes/ObjectExplorers/FLEXViewControllerExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXViewControllerExplorerViewController.h


Classes/ObjectExplorers/FLEXViewControllerExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXViewControllerExplorerViewController.m


Classes/ObjectExplorers/FLEXViewExplorerViewController.h → Classes/ObjectExplorers/Controllers/FLEXViewExplorerViewController.h


Classes/ObjectExplorers/FLEXViewExplorerViewController.m → Classes/ObjectExplorers/Controllers/FLEXViewExplorerViewController.m


+ 2 - 2
Classes/Utility/FLEXMultilineTableViewCell.h

@@ -6,11 +6,11 @@
 //  Copyright (c) 2015 f. All rights reserved.
 //
 
-#import <UIKit/UIKit.h>
+#import "FLEXTableViewCell.h"
 
 extern NSString *const kFLEXMultilineTableViewCellIdentifier;
 
-@interface FLEXMultilineTableViewCell : UITableViewCell
+@interface FLEXMultilineTableViewCell : FLEXTableViewCell
 
 + (CGFloat)preferredHeightWithAttributedText:(NSAttributedString *)attributedText inTableViewWidth:(CGFloat)tableViewWidth style:(UITableViewStyle)style showsAccessory:(BOOL)showsAccessory;
 

Classes/Utility/FLEXMultilineTableViewCell.m → Classes/ObjectExplorers/Views/FLEXMultilineTableViewCell.m


+ 17 - 0
Classes/ObjectExplorers/Views/FLEXSubtitleTableViewCell.h

@@ -0,0 +1,17 @@
+//
+//  FLEXSubtitleTableViewCell.h
+//  FLEX
+//
+//  Created by Tanner on 4/17/19.
+//  Copyright © 2019 Flipboard. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FLEXSubtitleTableViewCell : UITableViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 18 - 0
Classes/ObjectExplorers/Views/FLEXSubtitleTableViewCell.m

@@ -0,0 +1,18 @@
+//
+//  FLEXSubtitleTableViewCell.m
+//  FLEX
+//
+//  Created by Tanner on 4/17/19.
+//  Copyright © 2019 Flipboard. All rights reserved.
+//
+
+#import "FLEXSubtitleTableViewCell.h"
+
+@implementation FLEXSubtitleTableViewCell
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+    return [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
+}
+
+@end

+ 17 - 0
Classes/ObjectExplorers/Views/FLEXTableView.h

@@ -0,0 +1,17 @@
+//
+//  FLEXTableView.h
+//  FLEX
+//
+//  Created by Tanner on 4/17/19.
+//  Copyright © 2019 Flipboard. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface FLEXTableView : UITableView
+
+@property (nonatomic, readonly) NSString *defaultReuseIdentifier;
+@property (nonatomic, readonly) NSString *subtitleReuseIdentifier;
+@property (nonatomic, readonly) NSString *multilineReuseIdentifier;
+
+@end

+ 47 - 0
Classes/ObjectExplorers/Views/FLEXTableView.m

@@ -0,0 +1,47 @@
+//
+//  FLEXTableView.m
+//  FLEX
+//
+//  Created by Tanner on 4/17/19.
+//  Copyright © 2019 Flipboard. All rights reserved.
+//
+
+#import "FLEXTableView.h"
+#import "FLEXSubtitleTableViewCell.h"
+#import "FLEXMultilineTableViewCell.h"
+
+@implementation FLEXTableView
+
+- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style
+{    self = [super initWithFrame:frame style:style];
+    if (self) {
+        [self registerCells:@{
+            self.defaultReuseIdentifier: [FLEXTableViewCell class],
+            self.subtitleReuseIdentifier: [FLEXSubtitleTableViewCell class],
+            self.multilineReuseIdentifier: [FLEXMultilineTableViewCell class],
+        }];
+    }
+
+    return self;
+}
+
+- (void)registerCells:(NSDictionary<NSString*,Class> *)registrationMapping
+{    [registrationMapping enumerateKeysAndObjectsUsingBlock:^(NSString *identifier, Class cellClass, BOOL *stop) {
+        [self registerClass:cellClass forCellReuseIdentifier:identifier];
+    }];
+}
+
+- (NSString *)defaultReuseIdentifier
+{    return @"kFLEXTableViewCellIdentifier";
+}
+
+- (NSString *)subtitleReuseIdentifier
+{    return @"kFLEXSubtitleTableViewCellIdentifier";
+}
+
+- (NSString *)multilineReuseIdentifier
+{
+    return kFLEXMultilineTableViewCellIdentifier;
+}
+
+@end

+ 13 - 0
Classes/ObjectExplorers/Views/FLEXTableViewCell.h

@@ -0,0 +1,13 @@
+//
+//  FLEXTableViewCell.h
+//  FLEX
+//
+//  Created by Tanner on 4/17/19.
+//  Copyright © 2019 Flipboard. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface FLEXTableViewCell : UITableViewCell
+
+@end

+ 77 - 0
Classes/ObjectExplorers/Views/FLEXTableViewCell.m

@@ -0,0 +1,77 @@
+//
+//  FLEXTableViewCell.m
+//  FLEX
+//
+//  Created by Tanner on 4/17/19.
+//  Copyright © 2019 Flipboard. All rights reserved.
+//
+
+#import "FLEXTableViewCell.h"
+#import "FLEXUtility.h"
+#import "FLEXTableView.h"
+
+@interface UITableView (Internal)
+// Exists at least since iOS 5
+- (BOOL)_canPerformAction:(SEL)action forCell:(UITableViewCell *)cell sender:(id)sender;
+- (void)_performAction:(SEL)action forCell:(UITableViewCell *)cell sender:(id)sender;
+@end
+
+@interface UITableViewCell (Internal)
+// Exists at least since iOS 5
+@property (nonatomic, readonly) FLEXTableView *_tableView;
+@end
+
+@implementation FLEXTableViewCell
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    if (self) {
+        UIFont *cellFont = [FLEXUtility defaultTableViewCellLabelFont];
+        self.textLabel.font = cellFont;
+        self.detailTextLabel.font = cellFont;
+        self.detailTextLabel.textColor = [UIColor grayColor];
+    }
+
+    return self;
+}
+
+- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
+{
+    return [self._tableView _canPerformAction:action forCell:self sender:sender];
+}
+
+/// We use this to allow our table view to allow its delegate
+/// to handle any action it chooses to support, without
+/// explicitly implementing the method ourselelves.
+///
+/// Alternative considered: override respondsToSelector
+/// to return NO. I decided against this for simplicity's
+/// sake. I see this as "fixing" a poorly designed API.
+/// That approach would require lots of boilerplate to
+/// make the menu appear above this cell.
+- (void)forwardInvocation:(NSInvocation *)invocation
+{
+    // Must be unretained to avoid over-releasing
+    __unsafe_unretained id sender;
+    [invocation getArgument:&sender atIndex:2];
+    SEL action = invocation.selector;
+
+    // [self._tableView _performAction:action forCell:[self retain] sender:[sender retain]];
+    invocation.selector = @selector(_performAction:forCell:sender:);
+    [invocation setArgument:&action atIndex:2];
+    [invocation setArgument:(void *)&self atIndex:3];
+    [invocation setArgument:(void *)&sender atIndex:4];
+    [invocation invokeWithTarget:self._tableView];
+}
+
+- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
+{
+    if ([self canPerformAction:selector withSender:nil]) {
+        return [self._tableView methodSignatureForSelector:@selector(_performAction:forCell:sender:)];
+    }
+
+    return [super methodSignatureForSelector:selector];
+}
+
+@end

+ 72 - 32
FLEX.xcodeproj/project.pbxproj

@@ -44,8 +44,6 @@
 		3A4C94DC1B5B21410088C3F2 /* FLEXViewExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A4C94531B5B21410088C3F2 /* FLEXViewExplorerViewController.m */; };
 		3A4C94DD1B5B21410088C3F2 /* FLEXHeapEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A4C94551B5B21410088C3F2 /* FLEXHeapEnumerator.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		3A4C94DE1B5B21410088C3F2 /* FLEXHeapEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A4C94561B5B21410088C3F2 /* FLEXHeapEnumerator.m */; };
-		3A4C94DF1B5B21410088C3F2 /* FLEXMultilineTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A4C94571B5B21410088C3F2 /* FLEXMultilineTableViewCell.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		3A4C94E01B5B21410088C3F2 /* FLEXMultilineTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A4C94581B5B21410088C3F2 /* FLEXMultilineTableViewCell.m */; };
 		3A4C94E11B5B21410088C3F2 /* FLEXResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A4C94591B5B21410088C3F2 /* FLEXResources.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		3A4C94E21B5B21410088C3F2 /* FLEXResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A4C945A1B5B21410088C3F2 /* FLEXResources.m */; };
 		3A4C94E31B5B21410088C3F2 /* FLEXRuntimeUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A4C945B1B5B21410088C3F2 /* FLEXRuntimeUtility.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -179,6 +177,14 @@
 		C3DB9F642107FC9600B46809 /* FLEXObjectRef.h in Headers */ = {isa = PBXBuildFile; fileRef = C3DB9F622107FC9600B46809 /* FLEXObjectRef.h */; };
 		C3DB9F652107FC9600B46809 /* FLEXObjectRef.m in Sources */ = {isa = PBXBuildFile; fileRef = C3DB9F632107FC9600B46809 /* FLEXObjectRef.m */; };
 		C3DC287C223ED5F200F48AA6 /* FLEXOSLogController.m in Sources */ = {isa = PBXBuildFile; fileRef = C34EE30721CB23CC00BD3A7C /* FLEXOSLogController.m */; };
+		C3F31D3D2267D883003C991A /* FLEXSubtitleTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F31D342267D883003C991A /* FLEXSubtitleTableViewCell.h */; };
+		C3F31D3E2267D883003C991A /* FLEXTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F31D352267D883003C991A /* FLEXTableViewCell.h */; };
+		C3F31D3F2267D883003C991A /* FLEXMultilineTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F31D362267D883003C991A /* FLEXMultilineTableViewCell.h */; };
+		C3F31D402267D883003C991A /* FLEXSubtitleTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F31D372267D883003C991A /* FLEXSubtitleTableViewCell.m */; };
+		C3F31D412267D883003C991A /* FLEXMultilineTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F31D382267D883003C991A /* FLEXMultilineTableViewCell.m */; };
+		C3F31D422267D883003C991A /* FLEXTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F31D392267D883003C991A /* FLEXTableViewCell.m */; };
+		C3F31D432267D883003C991A /* FLEXTableView.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F31D3B2267D883003C991A /* FLEXTableView.h */; };
+		C3F31D442267D883003C991A /* FLEXTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F31D3C2267D883003C991A /* FLEXTableView.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -232,8 +238,6 @@
 		3A4C94531B5B21410088C3F2 /* FLEXViewExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXViewExplorerViewController.m; sourceTree = "<group>"; };
 		3A4C94551B5B21410088C3F2 /* FLEXHeapEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXHeapEnumerator.h; sourceTree = "<group>"; };
 		3A4C94561B5B21410088C3F2 /* FLEXHeapEnumerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXHeapEnumerator.m; sourceTree = "<group>"; };
-		3A4C94571B5B21410088C3F2 /* FLEXMultilineTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXMultilineTableViewCell.h; sourceTree = "<group>"; };
-		3A4C94581B5B21410088C3F2 /* FLEXMultilineTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXMultilineTableViewCell.m; sourceTree = "<group>"; };
 		3A4C94591B5B21410088C3F2 /* FLEXResources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXResources.h; sourceTree = "<group>"; };
 		3A4C945A1B5B21410088C3F2 /* FLEXResources.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXResources.m; sourceTree = "<group>"; };
 		3A4C945B1B5B21410088C3F2 /* FLEXRuntimeUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXRuntimeUtility.h; sourceTree = "<group>"; };
@@ -369,6 +373,14 @@
 		C3DA55FD21A76406005DDA60 /* FLEXMutableFieldEditorViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXMutableFieldEditorViewController.m; sourceTree = "<group>"; };
 		C3DB9F622107FC9600B46809 /* FLEXObjectRef.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXObjectRef.h; sourceTree = "<group>"; };
 		C3DB9F632107FC9600B46809 /* FLEXObjectRef.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXObjectRef.m; sourceTree = "<group>"; };
+		C3F31D342267D883003C991A /* FLEXSubtitleTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXSubtitleTableViewCell.h; sourceTree = "<group>"; };
+		C3F31D352267D883003C991A /* FLEXTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXTableViewCell.h; sourceTree = "<group>"; };
+		C3F31D362267D883003C991A /* FLEXMultilineTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXMultilineTableViewCell.h; sourceTree = "<group>"; };
+		C3F31D372267D883003C991A /* FLEXSubtitleTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXSubtitleTableViewCell.m; sourceTree = "<group>"; };
+		C3F31D382267D883003C991A /* FLEXMultilineTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXMultilineTableViewCell.m; sourceTree = "<group>"; };
+		C3F31D392267D883003C991A /* FLEXTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXTableViewCell.m; sourceTree = "<group>"; };
+		C3F31D3B2267D883003C991A /* FLEXTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXTableView.h; sourceTree = "<group>"; };
+		C3F31D3C2267D883003C991A /* FLEXTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXTableView.m; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -451,32 +463,10 @@
 		3A4C943B1B5B21410088C3F2 /* ObjectExplorers */ = {
 			isa = PBXGroup;
 			children = (
-				3A4C943C1B5B21410088C3F2 /* FLEXArrayExplorerViewController.h */,
-				3A4C943D1B5B21410088C3F2 /* FLEXArrayExplorerViewController.m */,
-				3A4C943E1B5B21410088C3F2 /* FLEXClassExplorerViewController.h */,
-				3A4C943F1B5B21410088C3F2 /* FLEXClassExplorerViewController.m */,
-				3A4C94401B5B21410088C3F2 /* FLEXDefaultsExplorerViewController.h */,
-				3A4C94411B5B21410088C3F2 /* FLEXDefaultsExplorerViewController.m */,
-				3A4C94421B5B21410088C3F2 /* FLEXDictionaryExplorerViewController.h */,
-				3A4C94431B5B21410088C3F2 /* FLEXDictionaryExplorerViewController.m */,
-				3A4C94441B5B21410088C3F2 /* FLEXGlobalsTableViewControllerEntry.h */,
-				3A4C94451B5B21410088C3F2 /* FLEXGlobalsTableViewControllerEntry.m */,
-				3A4C94461B5B21410088C3F2 /* FLEXImageExplorerViewController.h */,
-				3A4C94471B5B21410088C3F2 /* FLEXImageExplorerViewController.m */,
-				3A4C94481B5B21410088C3F2 /* FLEXLayerExplorerViewController.h */,
-				3A4C94491B5B21410088C3F2 /* FLEXLayerExplorerViewController.m */,
 				3A4C944A1B5B21410088C3F2 /* FLEXObjectExplorerFactory.h */,
 				3A4C944B1B5B21410088C3F2 /* FLEXObjectExplorerFactory.m */,
-				3A4C944C1B5B21410088C3F2 /* FLEXObjectExplorerViewController.h */,
-				3A4C944D1B5B21410088C3F2 /* FLEXObjectExplorerViewController.m */,
-				3A4C944E1B5B21410088C3F2 /* FLEXSetExplorerViewController.h */,
-				3A4C944F1B5B21410088C3F2 /* FLEXSetExplorerViewController.m */,
-				3A4C94501B5B21410088C3F2 /* FLEXViewControllerExplorerViewController.h */,
-				3A4C94511B5B21410088C3F2 /* FLEXViewControllerExplorerViewController.m */,
-				3A4C94521B5B21410088C3F2 /* FLEXViewExplorerViewController.h */,
-				3A4C94531B5B21410088C3F2 /* FLEXViewExplorerViewController.m */,
-				C395D6D721789BD800BEAD4D /* FLEXColorExplorerViewController.h */,
-				C395D6D821789BD800BEAD4D /* FLEXColorExplorerViewController.m */,
+				C3F31D3A2267D883003C991A /* Views */,
+				C3F31D452267D8A2003C991A /* Controllers */,
 			);
 			path = ObjectExplorers;
 			sourceTree = "<group>";
@@ -486,8 +476,6 @@
 			children = (
 				3A4C94551B5B21410088C3F2 /* FLEXHeapEnumerator.h */,
 				3A4C94561B5B21410088C3F2 /* FLEXHeapEnumerator.m */,
-				3A4C94571B5B21410088C3F2 /* FLEXMultilineTableViewCell.h */,
-				3A4C94581B5B21410088C3F2 /* FLEXMultilineTableViewCell.m */,
 				3A4C94591B5B21410088C3F2 /* FLEXResources.h */,
 				3A4C945A1B5B21410088C3F2 /* FLEXResources.m */,
 				C37A0C91218BAC9600848CA7 /* FLEXObjcInternal.h */,
@@ -720,6 +708,52 @@
 			name = ExplorerInterface;
 			sourceTree = "<group>";
 		};
+		C3F31D3A2267D883003C991A /* Views */ = {
+			isa = PBXGroup;
+			children = (
+				C3F31D3B2267D883003C991A /* FLEXTableView.h */,
+				C3F31D3C2267D883003C991A /* FLEXTableView.m */,
+				C3F31D352267D883003C991A /* FLEXTableViewCell.h */,
+				C3F31D392267D883003C991A /* FLEXTableViewCell.m */,
+				C3F31D342267D883003C991A /* FLEXSubtitleTableViewCell.h */,
+				C3F31D372267D883003C991A /* FLEXSubtitleTableViewCell.m */,
+				C3F31D362267D883003C991A /* FLEXMultilineTableViewCell.h */,
+				C3F31D382267D883003C991A /* FLEXMultilineTableViewCell.m */,
+			);
+			path = Views;
+			sourceTree = "<group>";
+		};
+		C3F31D452267D8A2003C991A /* Controllers */ = {
+			isa = PBXGroup;
+			children = (
+				3A4C944C1B5B21410088C3F2 /* FLEXObjectExplorerViewController.h */,
+				3A4C944D1B5B21410088C3F2 /* FLEXObjectExplorerViewController.m */,
+				3A4C943C1B5B21410088C3F2 /* FLEXArrayExplorerViewController.h */,
+				3A4C943D1B5B21410088C3F2 /* FLEXArrayExplorerViewController.m */,
+				3A4C943E1B5B21410088C3F2 /* FLEXClassExplorerViewController.h */,
+				3A4C943F1B5B21410088C3F2 /* FLEXClassExplorerViewController.m */,
+				3A4C94401B5B21410088C3F2 /* FLEXDefaultsExplorerViewController.h */,
+				3A4C94411B5B21410088C3F2 /* FLEXDefaultsExplorerViewController.m */,
+				3A4C94421B5B21410088C3F2 /* FLEXDictionaryExplorerViewController.h */,
+				3A4C94431B5B21410088C3F2 /* FLEXDictionaryExplorerViewController.m */,
+				3A4C94441B5B21410088C3F2 /* FLEXGlobalsTableViewControllerEntry.h */,
+				3A4C94451B5B21410088C3F2 /* FLEXGlobalsTableViewControllerEntry.m */,
+				3A4C94461B5B21410088C3F2 /* FLEXImageExplorerViewController.h */,
+				3A4C94471B5B21410088C3F2 /* FLEXImageExplorerViewController.m */,
+				3A4C94481B5B21410088C3F2 /* FLEXLayerExplorerViewController.h */,
+				3A4C94491B5B21410088C3F2 /* FLEXLayerExplorerViewController.m */,
+				3A4C944E1B5B21410088C3F2 /* FLEXSetExplorerViewController.h */,
+				3A4C944F1B5B21410088C3F2 /* FLEXSetExplorerViewController.m */,
+				3A4C94501B5B21410088C3F2 /* FLEXViewControllerExplorerViewController.h */,
+				3A4C94511B5B21410088C3F2 /* FLEXViewControllerExplorerViewController.m */,
+				3A4C94521B5B21410088C3F2 /* FLEXViewExplorerViewController.h */,
+				3A4C94531B5B21410088C3F2 /* FLEXViewExplorerViewController.m */,
+				C395D6D721789BD800BEAD4D /* FLEXColorExplorerViewController.h */,
+				C395D6D821789BD800BEAD4D /* FLEXColorExplorerViewController.m */,
+			);
+			path = Controllers;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */
@@ -748,7 +782,6 @@
 				3A4C94DB1B5B21410088C3F2 /* FLEXViewExplorerViewController.h in Headers */,
 				3A4C95321B5B21410088C3F2 /* FLEXSystemLogTableViewCell.h in Headers */,
 				3A4C94F91B5B21410088C3F2 /* FLEXArgumentInputNumberView.h in Headers */,
-				3A4C94DF1B5B21410088C3F2 /* FLEXMultilineTableViewCell.h in Headers */,
 				3A4C953A1B5B21410088C3F2 /* FLEXNetworkSettingsTableViewController.h in Headers */,
 				3A4C94D11B5B21410088C3F2 /* FLEXLayerExplorerViewController.h in Headers */,
 				779B1ED01C0C4D7C001F5E49 /* FLEXMultiColumnTableView.h in Headers */,
@@ -772,7 +805,9 @@
 				224D49AA1C673AB5000EAB86 /* FLEXSQLiteDatabaseManager.h in Headers */,
 				3A4C95031B5B21410088C3F2 /* FLEXArgumentInputView.h in Headers */,
 				94A5151D1C4CA1F10063292F /* FLEXExplorerViewController.h in Headers */,
+				C3F31D3F2267D883003C991A /* FLEXMultilineTableViewCell.h in Headers */,
 				3A4C94C51B5B21410088C3F2 /* FLEXArrayExplorerViewController.h in Headers */,
+				C3F31D432267D883003C991A /* FLEXTableView.h in Headers */,
 				3A4C94CB1B5B21410088C3F2 /* FLEXDictionaryExplorerViewController.h in Headers */,
 				3A4C95071B5B21410088C3F2 /* FLEXDefaultEditorViewController.h in Headers */,
 				C309B82F223ED64400B228EC /* FLEXLogController.h in Headers */,
@@ -786,10 +821,12 @@
 				3A4C94EF1B5B21410088C3F2 /* FLEXArgumentInputDateView.h in Headers */,
 				3A4C94C71B5B21410088C3F2 /* FLEXClassExplorerViewController.h in Headers */,
 				3A4C94F71B5B21410088C3F2 /* FLEXArgumentInputNotSupportedView.h in Headers */,
+				C3F31D3E2267D883003C991A /* FLEXTableViewCell.h in Headers */,
 				3A4C94E51B5B21410088C3F2 /* FLEXUtility.h in Headers */,
 				3A4C94CF1B5B21410088C3F2 /* FLEXImageExplorerViewController.h in Headers */,
 				2EF6B04E1D494BE50006BDA5 /* FLEXNetworkCurlLogger.h in Headers */,
 				3A4C950B1B5B21410088C3F2 /* FLEXFieldEditorViewController.h in Headers */,
+				C3F31D3D2267D883003C991A /* FLEXSubtitleTableViewCell.h in Headers */,
 				94A515251C4CA2080063292F /* FLEXExplorerToolbar.h in Headers */,
 				3A4C953C1B5B21410088C3F2 /* FLEXNetworkTransaction.h in Headers */,
 				3A4C94D71B5B21410088C3F2 /* FLEXSetExplorerViewController.h in Headers */,
@@ -941,6 +978,7 @@
 				C3DA55FF21A76406005DDA60 /* FLEXMutableFieldEditorViewController.m in Sources */,
 				3A4C95081B5B21410088C3F2 /* FLEXDefaultEditorViewController.m in Sources */,
 				779B1ED11C0C4D7C001F5E49 /* FLEXMultiColumnTableView.m in Sources */,
+				C3F31D412267D883003C991A /* FLEXMultilineTableViewCell.m in Sources */,
 				3A4C94EE1B5B21410088C3F2 /* FLEXArgumentInputColorView.m in Sources */,
 				3A4C94F01B5B21410088C3F2 /* FLEXArgumentInputDateView.m in Sources */,
 				3A4C94CA1B5B21410088C3F2 /* FLEXDefaultsExplorerViewController.m in Sources */,
@@ -948,7 +986,7 @@
 				679F64871BD53B7B00A8C94C /* FLEXCookiesTableViewController.m in Sources */,
 				3A4C94CE1B5B21410088C3F2 /* FLEXGlobalsTableViewControllerEntry.m in Sources */,
 				3A4C94FE1B5B21410088C3F2 /* FLEXArgumentInputStructView.m in Sources */,
-				3A4C94E01B5B21410088C3F2 /* FLEXMultilineTableViewCell.m in Sources */,
+				C3F31D402267D883003C991A /* FLEXSubtitleTableViewCell.m in Sources */,
 				3A4C95431B5B21410088C3F2 /* FLEXNetworkObserver.m in Sources */,
 				3A4C94D21B5B21410088C3F2 /* FLEXLayerExplorerViewController.m in Sources */,
 				779B1EDB1C0C4D7C001F5E49 /* FLEXTableListViewController.m in Sources */,
@@ -969,6 +1007,7 @@
 				94A515281C4CA2080063292F /* FLEXToolbarItem.m in Sources */,
 				3A4C94D81B5B21410088C3F2 /* FLEXSetExplorerViewController.m in Sources */,
 				3A4C95311B5B21410088C3F2 /* FLEXSystemLogMessage.m in Sources */,
+				C3F31D422267D883003C991A /* FLEXTableViewCell.m in Sources */,
 				3A4C94F41B5B21410088C3F2 /* FLEXArgumentInputFontView.m in Sources */,
 				3A4C953B1B5B21410088C3F2 /* FLEXNetworkSettingsTableViewController.m in Sources */,
 				3A4C94FC1B5B21410088C3F2 /* FLEXArgumentInputStringView.m in Sources */,
@@ -987,6 +1026,7 @@
 				C395D6DA21789BD800BEAD4D /* FLEXColorExplorerViewController.m in Sources */,
 				3A4C95001B5B21410088C3F2 /* FLEXArgumentInputSwitchView.m in Sources */,
 				3A4C94CC1B5B21410088C3F2 /* FLEXDictionaryExplorerViewController.m in Sources */,
+				C3F31D442267D883003C991A /* FLEXTableView.m in Sources */,
 				3A4C953F1B5B21410088C3F2 /* FLEXNetworkTransactionDetailTableViewController.m in Sources */,
 				224D49AB1C673AB5000EAB86 /* FLEXSQLiteDatabaseManager.m in Sources */,
 				779B1ED91C0C4D7C001F5E49 /* FLEXTableLeftCell.m in Sources */,