Просмотр исходного кода

Long press on hierarchy item to show VCs at tap

Tanner Bennett лет назад: 6
Родитель
Сommit
18f20fbf3b

+ 20 - 0
Classes/ExplorerInterface/FLEXExplorerViewController.m

@@ -20,6 +20,7 @@
 #import "FLEXNetworkMITMViewController.h"
 #import "FLEXNetworkMITMViewController.h"
 #import "FLEXTabsViewController.h"
 #import "FLEXTabsViewController.h"
 #import "FLEXWindowManagerController.h"
 #import "FLEXWindowManagerController.h"
+#import "FLEXViewControllersViewController.h"
 
 
 static NSString *const kFLEXToolbarTopMarginDefaultsKey = @"com.flex.FLEXToolbar.topMargin";
 static NSString *const kFLEXToolbarTopMarginDefaultsKey = @"com.flex.FLEXToolbar.topMargin";
 
 
@@ -446,6 +447,11 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
     [toolbar.selectItem addGestureRecognizer:[[UILongPressGestureRecognizer alloc]
     [toolbar.selectItem addGestureRecognizer:[[UILongPressGestureRecognizer alloc]
         initWithTarget:self action:@selector(handleToolbarWindowManagerGesture:)
         initWithTarget:self action:@selector(handleToolbarWindowManagerGesture:)
     ]];
     ]];
+    
+    // Long press gesture to present view controllers at tap
+    [toolbar.hierarchyItem addGestureRecognizer:[[UILongPressGestureRecognizer alloc]
+        initWithTarget:self action:@selector(handleToolbarShowViewControllersGesture:)
+    ]];
 }
 }
 
 
 - (void)handleToolbarPanGesture:(UIPanGestureRecognizer *)panGR {
 - (void)handleToolbarPanGesture:(UIPanGestureRecognizer *)panGR {
@@ -539,6 +545,20 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
     ] animated:YES completion:nil];
     ] animated:YES completion:nil];
 }
 }
 
 
+- (void)handleToolbarShowViewControllersGesture:(UILongPressGestureRecognizer *)sender {
+    if (self.viewsAtTapPoint.count) {
+        // Back up the UIMenuController items since dismissViewController: will attempt to replace them
+        self.appMenuItems = UIMenuController.sharedMenuController.menuItems;
+        
+        UIViewController *list = [FLEXViewControllersViewController
+            controllersForViews:self.viewsAtTapPoint
+        ];
+        [self presentViewController:
+            [FLEXNavigationController withRootViewController:list
+        ] animated:YES completion:nil];
+    }
+}
+
 
 
 #pragma mark - View Selection
 #pragma mark - View Selection
 
 

+ 19 - 0
Classes/ExplorerInterface/FLEXViewControllersViewController.h

@@ -0,0 +1,19 @@
+//
+//  FLEXViewControllersViewController.h
+//  FLEX
+//
+//  Created by Tanner Bennett on 2/13/20.
+//  Copyright © 2020 Flipboard. All rights reserved.
+//
+
+#import "FLEXTableViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FLEXViewControllersViewController : FLEXTableViewController
+
++ (instancetype)controllersForViews:(NSArray<UIView *> *)views;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 89 - 0
Classes/ExplorerInterface/FLEXViewControllersViewController.m

@@ -0,0 +1,89 @@
+//
+//  FLEXViewControllersViewController.m
+//  FLEX
+//
+//  Created by Tanner Bennett on 2/13/20.
+//  Copyright © 2020 Flipboard. All rights reserved.
+//
+
+#import "FLEXViewControllersViewController.h"
+#import "FLEXObjectExplorerFactory.h"
+
+@interface FLEXViewControllersViewController ()
+@property (nonatomic, readonly) NSArray<UIViewController *> *controllers;
+@end
+
+@implementation FLEXViewControllersViewController
+
+#pragma mark - Initialization
+
++ (instancetype)controllersForViews:(NSArray<UIView *> *)views {
+    return [[self alloc] initWithViews:views];
+}
+
+- (id)initWithViews:(NSArray<UIView *> *)views {
+    NSParameterAssert(views.count);
+    
+    self = [self init];
+    if (self) {
+        _controllers = [views flex_mapped:^id(UIView *view, NSUInteger idx) {
+            return [FLEXUtility viewControllerForView:view];
+        }];
+    }
+    
+    return self;
+}
+
+- (id)init {
+    return [self initWithStyle:UITableViewStylePlain];
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+    self.title = @"View Controllers at Tap";
+    [self disableToolbar];
+}
+
+
+#pragma mark - Private
+
+- (void)dismissAnimated {
+    [self dismissViewControllerAnimated:YES completion:nil];
+}
+
+
+#pragma mark - Table View Data Source
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.controllers.count;
+}
+
+- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
+    return @"View Controllers";
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kFLEXDetailCell forIndexPath:indexPath];
+    UIViewController *controller = self.controllers[indexPath.row];
+    
+    cell.textLabel.text = [NSString
+        stringWithFormat:@"%@ — %p", NSStringFromClass(controller.class), controller
+    ];
+    cell.detailTextLabel.text = controller.view.description;
+    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
+    cell.textLabel.lineBreakMode = NSLineBreakByTruncatingTail;
+    
+    return cell;
+}
+
+
+#pragma mark - Table View Delegate
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    [self.navigationController pushViewController:
+        [FLEXObjectExplorerFactory explorerViewControllerForObject:self.controllers[indexPath.row]]
+    animated:YES];
+}
+
+@end

+ 14 - 0
FLEX.xcodeproj/project.pbxproj

@@ -148,6 +148,8 @@
 		C312A13523ECBE5800E38049 /* FLEXBookmarksViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C312A13323ECBE5800E38049 /* FLEXBookmarksViewController.m */; };
 		C312A13523ECBE5800E38049 /* FLEXBookmarksViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C312A13323ECBE5800E38049 /* FLEXBookmarksViewController.m */; };
 		C312A13C23ECE79000E38049 /* FLEXWindowManagerController.m in Sources */ = {isa = PBXBuildFile; fileRef = C312A13A23ECE79000E38049 /* FLEXWindowManagerController.m */; };
 		C312A13C23ECE79000E38049 /* FLEXWindowManagerController.m in Sources */ = {isa = PBXBuildFile; fileRef = C312A13A23ECE79000E38049 /* FLEXWindowManagerController.m */; };
 		C312A13D23ECE79000E38049 /* FLEXWindowManagerController.h in Headers */ = {isa = PBXBuildFile; fileRef = C312A13B23ECE79000E38049 /* FLEXWindowManagerController.h */; };
 		C312A13D23ECE79000E38049 /* FLEXWindowManagerController.h in Headers */ = {isa = PBXBuildFile; fileRef = C312A13B23ECE79000E38049 /* FLEXWindowManagerController.h */; };
+		C313853F23F5C1A10046E63C /* FLEXViewControllersViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C313853D23F5C1A10046E63C /* FLEXViewControllersViewController.h */; };
+		C313854023F5C1A10046E63C /* FLEXViewControllersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C313853E23F5C1A10046E63C /* FLEXViewControllersViewController.m */; };
 		C31C4A6923342A2200C35F12 /* FLEXMetadataSection.h in Headers */ = {isa = PBXBuildFile; fileRef = C31C4A6723342A2200C35F12 /* FLEXMetadataSection.h */; };
 		C31C4A6923342A2200C35F12 /* FLEXMetadataSection.h in Headers */ = {isa = PBXBuildFile; fileRef = C31C4A6723342A2200C35F12 /* FLEXMetadataSection.h */; };
 		C31C4A6A23342A2200C35F12 /* FLEXMetadataSection.m in Sources */ = {isa = PBXBuildFile; fileRef = C31C4A6823342A2200C35F12 /* FLEXMetadataSection.m */; };
 		C31C4A6A23342A2200C35F12 /* FLEXMetadataSection.m in Sources */ = {isa = PBXBuildFile; fileRef = C31C4A6823342A2200C35F12 /* FLEXMetadataSection.m */; };
 		C31D93E423E38CBE005517BF /* FLEXBlockShortcuts.h in Headers */ = {isa = PBXBuildFile; fileRef = C31D93E223E38CBE005517BF /* FLEXBlockShortcuts.h */; };
 		C31D93E423E38CBE005517BF /* FLEXBlockShortcuts.h in Headers */ = {isa = PBXBuildFile; fileRef = C31D93E223E38CBE005517BF /* FLEXBlockShortcuts.h */; };
@@ -483,6 +485,8 @@
 		C312A13323ECBE5800E38049 /* FLEXBookmarksViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXBookmarksViewController.m; sourceTree = "<group>"; };
 		C312A13323ECBE5800E38049 /* FLEXBookmarksViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXBookmarksViewController.m; sourceTree = "<group>"; };
 		C312A13A23ECE79000E38049 /* FLEXWindowManagerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXWindowManagerController.m; sourceTree = "<group>"; };
 		C312A13A23ECE79000E38049 /* FLEXWindowManagerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXWindowManagerController.m; sourceTree = "<group>"; };
 		C312A13B23ECE79000E38049 /* FLEXWindowManagerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXWindowManagerController.h; sourceTree = "<group>"; };
 		C312A13B23ECE79000E38049 /* FLEXWindowManagerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXWindowManagerController.h; sourceTree = "<group>"; };
+		C313853D23F5C1A10046E63C /* FLEXViewControllersViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXViewControllersViewController.h; sourceTree = "<group>"; };
+		C313853E23F5C1A10046E63C /* FLEXViewControllersViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXViewControllersViewController.m; sourceTree = "<group>"; };
 		C31C4A6723342A2200C35F12 /* FLEXMetadataSection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXMetadataSection.h; sourceTree = "<group>"; };
 		C31C4A6723342A2200C35F12 /* FLEXMetadataSection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXMetadataSection.h; sourceTree = "<group>"; };
 		C31C4A6823342A2200C35F12 /* FLEXMetadataSection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXMetadataSection.m; sourceTree = "<group>"; };
 		C31C4A6823342A2200C35F12 /* FLEXMetadataSection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXMetadataSection.m; sourceTree = "<group>"; };
 		C31D93E223E38CBE005517BF /* FLEXBlockShortcuts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXBlockShortcuts.h; sourceTree = "<group>"; };
 		C31D93E223E38CBE005517BF /* FLEXBlockShortcuts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXBlockShortcuts.h; sourceTree = "<group>"; };
@@ -1000,6 +1004,8 @@
 				94A5151A1C4CA1F10063292F /* FLEXExplorerViewController.m */,
 				94A5151A1C4CA1F10063292F /* FLEXExplorerViewController.m */,
 				C312A13B23ECE79000E38049 /* FLEXWindowManagerController.h */,
 				C312A13B23ECE79000E38049 /* FLEXWindowManagerController.h */,
 				C312A13A23ECE79000E38049 /* FLEXWindowManagerController.m */,
 				C312A13A23ECE79000E38049 /* FLEXWindowManagerController.m */,
+				C313853D23F5C1A10046E63C /* FLEXViewControllersViewController.h */,
+				C313853E23F5C1A10046E63C /* FLEXViewControllersViewController.m */,
 			);
 			);
 			path = ExplorerInterface;
 			path = ExplorerInterface;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1448,6 +1454,7 @@
 				C34D4EB423A2AF2A00C1F903 /* FLEXColorPreviewSection.h in Headers */,
 				C34D4EB423A2AF2A00C1F903 /* FLEXColorPreviewSection.h in Headers */,
 				C383C3BE23B6B398007A321B /* UITextField+Range.h in Headers */,
 				C383C3BE23B6B398007A321B /* UITextField+Range.h in Headers */,
 				224D49A81C673AB5000EAB86 /* FLEXRealmDatabaseManager.h in Headers */,
 				224D49A81C673AB5000EAB86 /* FLEXRealmDatabaseManager.h in Headers */,
+				C313853F23F5C1A10046E63C /* FLEXViewControllersViewController.h in Headers */,
 				C398682623AC359600E9E391 /* FLEXShortcutsFactory+Defaults.h in Headers */,
 				C398682623AC359600E9E391 /* FLEXShortcutsFactory+Defaults.h in Headers */,
 				7349FD6A22B93CDF00051810 /* FLEXColor.h in Headers */,
 				7349FD6A22B93CDF00051810 /* FLEXColor.h in Headers */,
 				C36FBFD3230F3B98008D95D5 /* FLEXMethod.h in Headers */,
 				C36FBFD3230F3B98008D95D5 /* FLEXMethod.h in Headers */,
@@ -1533,6 +1540,7 @@
 					};
 					};
 					3A4C941E1B5B20570088C3F2 = {
 					3A4C941E1B5B20570088C3F2 = {
 						CreatedOnToolsVersion = 6.4;
 						CreatedOnToolsVersion = 6.4;
+						LastSwiftMigration = 1130;
 						ProvisioningStyle = Manual;
 						ProvisioningStyle = Manual;
 					};
 					};
 				};
 				};
@@ -1635,6 +1643,7 @@
 				3A4C94F01B5B21410088C3F2 /* FLEXArgumentInputDateView.m in Sources */,
 				3A4C94F01B5B21410088C3F2 /* FLEXArgumentInputDateView.m in Sources */,
 				C398627723AD79B7007E6793 /* NSString+FLEX.m in Sources */,
 				C398627723AD79B7007E6793 /* NSString+FLEX.m in Sources */,
 				C36FBFDC230F3B98008D95D5 /* FLEXIvar.m in Sources */,
 				C36FBFDC230F3B98008D95D5 /* FLEXIvar.m in Sources */,
+				C313854023F5C1A10046E63C /* FLEXViewControllersViewController.m in Sources */,
 				C3F527C22318670F009CBA07 /* FLEXImageShortcuts.m in Sources */,
 				C3F527C22318670F009CBA07 /* FLEXImageShortcuts.m in Sources */,
 				679F64871BD53B7B00A8C94C /* FLEXCookiesTableViewController.m in Sources */,
 				679F64871BD53B7B00A8C94C /* FLEXCookiesTableViewController.m in Sources */,
 				C3A9422D23C3DA39006871A3 /* FHSView.m in Sources */,
 				C3A9422D23C3DA39006871A3 /* FHSView.m in Sources */,
@@ -1904,6 +1913,7 @@
 		3A4C94361B5B20570088C3F2 /* Debug */ = {
 		3A4C94361B5B20570088C3F2 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
 			buildSettings = {
 			buildSettings = {
+				CLANG_ENABLE_MODULES = YES;
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CLANG_WARN_STRICT_PROTOTYPES = NO;
 				CLANG_WARN_STRICT_PROTOTYPES = NO;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_IDENTITY = "";
@@ -1926,6 +1936,8 @@
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
 				PROVISIONING_PROFILE_SPECIFIER = "";
 				SKIP_INSTALL = YES;
 				SKIP_INSTALL = YES;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+				SWIFT_VERSION = 5.0;
 				WARNING_CFLAGS = "-Wno-unsupported-availability-guard";
 				WARNING_CFLAGS = "-Wno-unsupported-availability-guard";
 			};
 			};
 			name = Debug;
 			name = Debug;
@@ -1933,6 +1945,7 @@
 		3A4C94371B5B20570088C3F2 /* Release */ = {
 		3A4C94371B5B20570088C3F2 /* Release */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
 			buildSettings = {
 			buildSettings = {
+				CLANG_ENABLE_MODULES = YES;
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CLANG_WARN_STRICT_PROTOTYPES = NO;
 				CLANG_WARN_STRICT_PROTOTYPES = NO;
 				CODE_SIGN_IDENTITY = "";
 				CODE_SIGN_IDENTITY = "";
@@ -1955,6 +1968,7 @@
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
 				PROVISIONING_PROFILE_SPECIFIER = "";
 				SKIP_INSTALL = YES;
 				SKIP_INSTALL = YES;
+				SWIFT_VERSION = 5.0;
 				WARNING_CFLAGS = "-Wno-unsupported-availability-guard";
 				WARNING_CFLAGS = "-Wno-unsupported-availability-guard";
 			};
 			};
 			name = Release;
 			name = Release;