Ich habe es gelöst und einen Brauch erstellt ixPopoverBarButtonItem
, der entweder den Übergang auslöst oder das angezeigte Popover schließt.
Was ich tue: Ich schalte die Aktion und das Ziel der Schaltfläche um, sodass entweder der Übergang ausgelöst wird oder das aktuell angezeigte Popover gelöscht wird.
Ich habe viel gegoogelt, um diese Lösung zu finden. Ich möchte nicht die Credits für die Idee nehmen, die Aktion umzuschalten. Das Einfügen des Codes in eine benutzerdefinierte Schaltfläche war mein Ansatz, um den Boilerplate-Code aus meiner Sicht auf ein Minimum zu beschränken.
Im Storyboard definiere ich die Klasse des BarButtonItem für meine benutzerdefinierte Klasse:
Dann übergebe ich das vom Segue erstellte Popover an meine benutzerdefinierte Schaltflächenimplementierung in der prepareForSegue:sender:
Methode:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"myPopoverSegue"]) {
UIStoryboardPopoverSegue* popSegue = (UIStoryboardPopoverSegue*)segue;
[(ixPopoverBarButtonItem *)sender showingPopover:popSegue.popoverController];
}
}
Übrigens ... da ich mehr als eine Schaltfläche habe, die Popover auslöst, muss ich immer noch eine Referenz des aktuell angezeigten Popovers behalten und es schließen, wenn ich das neue sichtbar mache, aber das war nicht Ihre Frage ...
So habe ich mein benutzerdefiniertes UIBarButtonItem implementiert:
...Schnittstelle:
@interface ixPopoverBarButtonItem : UIBarButtonItem
- (void) showingPopover: (UIPopoverController *)popoverController;
@end
... und impl:
#import "ixPopoverBarButtonItem.h"
@interface ixPopoverBarButtonItem ()
@property (strong, nonatomic) UIPopoverController *popoverController;
@property (nonatomic) SEL tempAction;
@property (nonatomic,assign) id tempTarget;
- (void) dismissPopover;
@end
@implementation ixPopoverBarButtonItem
@synthesize popoverController = _popoverController;
@synthesize tempAction = _tempAction;
@synthesize tempTarget = _tempTarget;
-(void)showingPopover:(UIPopoverController *)popoverController {
self.popoverController = popoverController;
self.tempAction = self.action;
self.tempTarget = self.target;
self.action = @selector(dismissPopover);
self.target = self;
}
-(void)dismissPopover {
[self.popoverController dismissPopoverAnimated:YES];
self.action = self.tempAction;
self.target = self.tempTarget;
self.popoverController = nil;
self.tempAction = nil;
self.tempTarget = nil;
}
@end
ps: Ich bin neu bei ARC, daher bin ich mir nicht ganz sicher, ob ich hier undicht bin. Bitte sag mir, ob ich ...