FLEXViewControllerShortcuts.m 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. //
  2. // FLEXViewControllerShortcuts.m
  3. // FLEX
  4. //
  5. // Created by Tanner Bennett on 12/12/19.
  6. // Copyright © 2019 Flipboard. All rights reserved.
  7. //
  8. #import "FLEXViewControllerShortcuts.h"
  9. #import "FLEXObjectExplorerFactory.h"
  10. #import "FLEXRuntimeUtility.h"
  11. #import "FLEXShortcut.h"
  12. #import "FLEXAlert.h"
  13. @interface FLEXViewControllerShortcuts ()
  14. @property (nonatomic, readonly) UIViewController *viewController;
  15. @property (nonatomic, readonly) BOOL viewControllerIsInUse;
  16. @end
  17. @implementation FLEXViewControllerShortcuts
  18. #pragma mark - Internal
  19. - (UIViewController *)viewController {
  20. return self.object;
  21. }
  22. /// A view controller is "in use" if it's view is in a window,
  23. /// or if it belongs to a navigation stack which is in use.
  24. - (BOOL)viewControllerIsInUse {
  25. if (self.viewController.view.window) {
  26. return YES;
  27. }
  28. return self.viewController.navigationController != nil;
  29. }
  30. #pragma mark - Overrides
  31. + (instancetype)forObject:(UIViewController *)viewController {
  32. BOOL (^vcIsInuse)(UIViewController *) = ^BOOL(UIViewController *controller) {
  33. if (controller.view.window) {
  34. return YES;
  35. }
  36. return controller.navigationController != nil;
  37. };
  38. return [self forObject:viewController additionalRows:@[
  39. [FLEXActionShortcut title:@"Push View Controller"
  40. subtitle:^NSString *(UIViewController *controller) {
  41. return vcIsInuse(controller) ? @"In use, cannot push" : nil;
  42. }
  43. selectionHandler:^void(UIViewController *host, UIViewController *controller) {
  44. if (!vcIsInuse(controller)) {
  45. [host.navigationController pushViewController:controller animated:YES];
  46. } else {
  47. [FLEXAlert
  48. showAlert:@"Cannot Push View Controller"
  49. message:@"This view controller's view is currently in use."
  50. from:host
  51. ];
  52. }
  53. }
  54. accessoryType:^UITableViewCellAccessoryType(UIViewController *controller) {
  55. if (!vcIsInuse(controller)) {
  56. return UITableViewCellAccessoryDisclosureIndicator;
  57. } else {
  58. return UITableViewCellAccessoryNone;
  59. }
  60. }
  61. ]
  62. ]];
  63. }
  64. @end