Sfoglia il codice sorgente

Bug fix: iPad support for FLEXAlert action sheets

Tanner Bennett 6 anni fa
parent
commit
2ca563f570

+ 1 - 1
Classes/Core/Controllers/FLEXTableViewController.h

@@ -140,7 +140,7 @@ extern CGFloat const kFLEXDebounceForExpensiveIO;
 @property (nonatomic) BOOL showsShareToolbarItem;
 /// Called when the share button is pressed.
 /// Default implementation does nothign. Subclasses may override.
-- (void)shareButtonPressed;
+- (void)shareButtonPressed:(UIBarButtonItem *)sender;
 
 /// Subclasses may call this to opt-out of all toolbar related behavior.
 /// This is necessary if you want to disable the gesture which reveals the toolbar.

+ 2 - 2
Classes/Core/Controllers/FLEXTableViewController.m

@@ -222,7 +222,7 @@ CGFloat const kFLEXDebounceForExpensiveIO = 0.5;
     self.tableView.dataSource = self;
     self.tableView.delegate = self;
     
-    _shareToolbarItem = FLEXBarButtonItemSystem(Action, self, @selector(shareButtonPressed));
+    _shareToolbarItem = FLEXBarButtonItemSystem(Action, self, @selector(shareButtonPressed:));
     _bookmarksToolbarItem = [UIBarButtonItem
         itemWithImage:FLEXResources.bookmarksIcon target:self action:@selector(showBookmarks)
     ];
@@ -386,7 +386,7 @@ CGFloat const kFLEXDebounceForExpensiveIO = 0.5;
     [self setupToolbarItems];
 }
 
-- (void)shareButtonPressed {
+- (void)shareButtonPressed:(UIBarButtonItem *)sender {
 
 }
 

+ 3 - 3
Classes/ExplorerInterface/Bookmarks/FLEXBookmarksViewController.m

@@ -68,7 +68,7 @@
 - (void)setupEditingBarItems {
     self.navigationItem.rightBarButtonItem = nil;
     self.toolbarItems = @[
-        [UIBarButtonItem itemWithTitle:@"Close All" target:self action:@selector(closeAllButtonPressed)],
+        [UIBarButtonItem itemWithTitle:@"Close All" target:self action:@selector(closeAllButtonPressed:)],
         UIBarButtonItem.flex_flexibleSpace,
         // We use a non-system done item because we change its title dynamically
         [UIBarButtonItem doneStyleitemWithTitle:@"Done" target:self action:@selector(toggleEditing)]
@@ -149,7 +149,7 @@
     }
 }
 
-- (void)closeAllButtonPressed {
+- (void)closeAllButtonPressed:(UIBarButtonItem *)sender {
     [FLEXAlert makeSheet:^(FLEXAlert *make) {
         NSInteger count = self.bookmarks.count;
         NSString *title = FLEXPluralFormatString(count, @"Remove %@ bookmarks", @"Remove %@ bookmark");
@@ -158,7 +158,7 @@
             [self toggleEditing];
         });
         make.button(@"Cancel").cancelStyle();
-    } showFrom:self];
+    } showFrom:self source:sender];
 }
 
 - (void)closeAll {

+ 6 - 6
Classes/ExplorerInterface/Tabs/FLEXTabsViewController.m

@@ -109,7 +109,7 @@
     self.toolbarItems = @[
         UIBarButtonItem.flex_fixedSpace,
         UIBarButtonItem.flex_flexibleSpace,
-        FLEXBarButtonItemSystem(Add, self, @selector(addTabButtonPressed)),
+        FLEXBarButtonItemSystem(Add, self, @selector(addTabButtonPressed:)),
         UIBarButtonItem.flex_flexibleSpace,
         FLEXBarButtonItemSystem(Edit, self, @selector(toggleEditing)),
     ];
@@ -121,7 +121,7 @@
 - (void)setupEditingBarItems {
     self.navigationItem.rightBarButtonItem = nil;
     self.toolbarItems = @[
-        [UIBarButtonItem itemWithTitle:@"Close All" target:self action:@selector(closeAllButtonPressed)],
+        [UIBarButtonItem itemWithTitle:@"Close All" target:self action:@selector(closeAllButtonPressed:)],
         UIBarButtonItem.flex_flexibleSpace,
         [UIBarButtonItem disabledSystemItem:UIBarButtonSystemItemAdd],
         UIBarButtonItem.flex_flexibleSpace,
@@ -193,7 +193,7 @@
     }
 }
 
-- (void)addTabButtonPressed {
+- (void)addTabButtonPressed:(UIBarButtonItem *)sender {
     if (FLEXBookmarkManager.bookmarks.count) {
         [FLEXAlert makeSheet:^(FLEXAlert *make) {
             make.title(@"New Tab");
@@ -208,7 +208,7 @@
                 ] animated:YES completion:nil];
             });
             make.button(@"Cancel").cancelStyle();
-        } showFrom:self];
+        } showFrom:self source:sender];
     } else {
         // No bookmarks, just open the main menu
         [self addTabAndDismiss:[FLEXNavigationController
@@ -224,7 +224,7 @@
     }];
 }
 
-- (void)closeAllButtonPressed {
+- (void)closeAllButtonPressed:(UIBarButtonItem *)sender {
     [FLEXAlert makeSheet:^(FLEXAlert *make) {
         NSInteger count = self.openTabs.count;
         NSString *title = FLEXPluralFormatString(count, @"Close %@ tabs", @"Close %@ tab");
@@ -233,7 +233,7 @@
             [self toggleEditing];
         });
         make.button(@"Cancel").cancelStyle();
-    } showFrom:self];
+    } showFrom:self source:sender];
 }
 
 - (void)closeAll {

+ 5 - 8
Classes/GlobalStateExplorers/Keychain/FLEXKeychainTableViewController.m

@@ -13,6 +13,7 @@
 #import "FLEXMutableListSection.h"
 #import "FLEXUtility.h"
 #import "UIPasteboard+FLEX.h"
+#import "UIBarButtonItem+FLEX.h"
 
 @interface FLEXKeychainTableViewController ()
 @property (nonatomic, readonly) FLEXMutableListSection<NSDictionary *> *section;
@@ -30,12 +31,8 @@
     [super viewDidLoad];
     
     self.navigationItem.rightBarButtonItems = @[
-        [[UIBarButtonItem alloc]
-            initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(trashPressed)
-        ],
-        [[UIBarButtonItem alloc]
-            initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPressed)
-        ],
+        [UIBarButtonItem systemItem:UIBarButtonSystemItemTrash target:self action:@selector(trashPressed:)],
+        [UIBarButtonItem systemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPressed)],
     ];
 
     [self reloadData];
@@ -127,7 +124,7 @@
 
 #pragma mark Buttons
 
-- (void)trashPressed {
+- (void)trashPressed:(UIBarButtonItem *)sender {
     [FLEXAlert makeSheet:^(FLEXAlert *make) {
         make.title(@"Clear Keychain");
         make.message(@"This will remove all keychain items for this app.\n");
@@ -140,7 +137,7 @@
             [self reloadData];
         });
         make.button(@"Cancel").cancelStyle();
-    } showFrom:self];
+    } showFrom:self source:sender];
 }
 
 - (void)addPressed {

+ 3 - 3
Classes/Network/FLEXNetworkMITMViewController.m

@@ -109,7 +109,7 @@
 
 #pragma mark Button Actions
 
-- (void)settingsButtonTapped:(id)sender {
+- (void)settingsButtonTapped:(UIBarButtonItem *)sender {
     UIViewController *settings = [FLEXNetworkSettingsController new];
     settings.navigationItem.rightBarButtonItem = FLEXBarButtonItemSystem(
         Done, self, @selector(settingsViewControllerDoneTapped:)
@@ -121,7 +121,7 @@
     [self presentViewController:nav animated:YES completion:nil];
 }
 
-- (void)trashButtonTapped:(id)sender {
+- (void)trashButtonTapped:(UIBarButtonItem *)sender {
     [FLEXAlert makeSheet:^(FLEXAlert *make) {
         make.title(@"Clear All Recorded Requests?");
         make.message(@"This cannot be undone.");
@@ -130,7 +130,7 @@
         make.button(@"Clear All").destructiveStyle().handler(^(NSArray *strings) {
             [FLEXNetworkRecorder.defaultRecorder clearRecordedActivity];
         });
-    } showFrom:self];
+    } showFrom:self source:sender];
 }
 
 - (void)settingsViewControllerDoneTapped:(id)sender {

+ 5 - 5
Classes/ObjectExplorers/FLEXObjectExplorerViewController.m

@@ -102,7 +102,7 @@
     
     // ... button for extra options
     [self addToolbarItems:@[[UIBarButtonItem
-        itemWithImage:FLEXResources.moreIcon target:self action:@selector(moreButtonPressed)
+        itemWithImage:FLEXResources.moreIcon target:self action:@selector(moreButtonPressed:)
     ]]];
 
     // Swipe gestures to swipe between classes in the hierarchy
@@ -217,7 +217,7 @@
     [super reloadData];
 }
 
-- (void)shareButtonPressed {
+- (void)shareButtonPressed:(UIBarButtonItem *)sender {
     [FLEXAlert makeSheet:^(FLEXAlert *make) {
         make.button(@"Add to Bookmarks").handler(^(NSArray<NSString *> *strings) {
             [FLEXBookmarkManager.bookmarks addObject:self.object];
@@ -229,7 +229,7 @@
             UIPasteboard.generalPasteboard.string = [FLEXUtility addressOfObject:self.object];
         });
         make.button(@"Cancel").cancelStyle();
-    } showFrom:self];
+    } showFrom:self source:sender];
 }
 
 
@@ -285,7 +285,7 @@
     return YES;
 }
     
-- (void)moreButtonPressed {
+- (void)moreButtonPressed:(UIBarButtonItem *)sender {
     NSUserDefaults *defaults = NSUserDefaults.standardUserDefaults;
     // Maps preference keys to a description of what they affect
     NSDictionary<NSString *, NSString *> *explorerToggles = @{
@@ -321,7 +321,7 @@
         }
         
         make.button(@"Cancel").cancelStyle();
-    } showFrom:self];
+    } showFrom:self source:sender];
 }
 
 #pragma mark - Description

+ 3 - 1
Classes/Utility/FLEXAlert.h

@@ -29,7 +29,9 @@ typedef FLEXAlertAction *(^FLEXAlertActionHandler)(void(^handler)(NSArray<NSStri
 /// Construct and display an alert
 + (void)makeAlert:(FLEXAlertBuilder)block showFrom:(UIViewController *)viewController;
 /// Construct and display an action sheet-style alert
-+ (void)makeSheet:(FLEXAlertBuilder)block showFrom:(UIViewController *)viewController;
++ (void)makeSheet:(FLEXAlertBuilder)block
+         showFrom:(UIViewController *)viewController
+           source:(id)viewOrBarItem;
 
 /// Construct an alert
 + (UIAlertController *)makeAlert:(FLEXAlertBuilder)block;

+ 30 - 5
Classes/Utility/FLEXAlert.m

@@ -62,17 +62,42 @@ NSAssert(!self._action, @"Cannot mutate action after retreiving underlying UIAle
     return alert._controller;
 }
 
-+ (void)make:(FLEXAlertBuilder)block withStyle:(UIAlertControllerStyle)style showFrom:(UIViewController *)viewController {
++ (void)make:(FLEXAlertBuilder)block
+   withStyle:(UIAlertControllerStyle)style
+    showFrom:(UIViewController *)viewController
+      source:(id)viewOrBarItem {
     UIAlertController *alert = [self make:block withStyle:style];
+    if ([viewOrBarItem isKindOfClass:[UIBarButtonItem class]]) {
+        alert.popoverPresentationController.barButtonItem = viewOrBarItem;
+    } else if ([viewOrBarItem isKindOfClass:[UIView class]]) {
+        alert.popoverPresentationController.sourceView = viewOrBarItem;
+        alert.popoverPresentationController.sourceRect = [viewOrBarItem bounds];
+    } else if (viewOrBarItem) {
+        NSParameterAssert(
+            [viewOrBarItem isKindOfClass:[UIBarButtonItem class]] ||
+            [viewOrBarItem isKindOfClass:[UIView class]] ||
+            !viewOrBarItem
+        );
+    }
     [viewController presentViewController:alert animated:YES completion:nil];
 }
 
-+ (void)makeAlert:(FLEXAlertBuilder)block showFrom:(UIViewController *)viewController {
-    [self make:block withStyle:UIAlertControllerStyleAlert showFrom:viewController];
++ (void)makeAlert:(FLEXAlertBuilder)block showFrom:(UIViewController *)controller {
+    [self make:block withStyle:UIAlertControllerStyleAlert showFrom:controller source:nil];
+}
+
++ (void)makeSheet:(FLEXAlertBuilder)block showFrom:(UIViewController *)controller {
+    [self make:block withStyle:UIAlertControllerStyleActionSheet showFrom:controller source:nil];
 }
 
-+ (void)makeSheet:(FLEXAlertBuilder)block showFrom:(UIViewController *)viewController {
-    [self make:block withStyle:UIAlertControllerStyleActionSheet showFrom:viewController];
+/// Construct and display an action sheet-style alert
++ (void)makeSheet:(FLEXAlertBuilder)block
+         showFrom:(UIViewController *)controller
+           source:(id)viewOrBarItem {
+    [self make:block
+     withStyle:UIAlertControllerStyleActionSheet
+      showFrom:controller
+        source:viewOrBarItem];
 }
 
 + (UIAlertController *)makeAlert:(FLEXAlertBuilder)block {

+ 3 - 3
Classes/ViewHierarchy/SnapshotExplorer/FHSViewController.m

@@ -162,7 +162,7 @@ BOOL const kFHSViewControllerExcludeFLEXWindows = YES;
         UIBarButtonItem.flex_flexibleSpace,
         [UIBarButtonItem
             itemWithImage:FLEXResources.moreIcon
-            target:self action:@selector(didPressOptionsButton)
+            target:self action:@selector(didPressOptionsButton:)
         ],
         UIBarButtonItem.flex_flexibleSpace,
         [UIBarButtonItem itemWithCustomView:snapshotView.depthSlider]
@@ -205,7 +205,7 @@ BOOL const kFHSViewControllerExcludeFLEXWindows = YES;
 
 #pragma mark Events
 
-- (void)didPressOptionsButton {
+- (void)didPressOptionsButton:(UIBarButtonItem *)sender {
     [FLEXAlert makeSheet:^(FLEXAlert *make) {
         if (self.selectedView) {
             make.button(@"Hide selected view").handler(^(NSArray<NSString *> *strings) {
@@ -227,7 +227,7 @@ BOOL const kFHSViewControllerExcludeFLEXWindows = YES;
             [self.snapshotView toggleShowBorders];
         });
         make.button(@"Cancel").cancelStyle();
-    } showFrom:self];
+    } showFrom:self source:sender];
 }
 
 - (void)resizeToolbarItems:(CGSize)viewSize {