我解决了这个问题,创建了一个ixPopoverBarButtonItem
触发 segue 或关闭显示的弹出框的自定义。
我做什么:我切换按钮的动作和目标,所以它要么触发 segue,要么处理当前显示的弹出框。
我花了很多时间在谷歌上搜索这个解决方案,我不想因为切换动作的想法而功劳。将代码放入自定义按钮是我将样板代码保持在最低限度的方法。
在情节提要中,我将 BarButtonItem 的类定义为我的自定义类:

然后我将 segue 创建的弹出框传递给prepareForSegue:sender:
方法中的自定义按钮实现:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"myPopoverSegue"]) {
UIStoryboardPopoverSegue* popSegue = (UIStoryboardPopoverSegue*)segue;
[(ixPopoverBarButtonItem *)sender showingPopover:popSegue.popoverController];
}
}
顺便说一句...由于我有多个按钮触发弹出框,我仍然必须保留当前显示的弹出框的引用并在我使新的可见时将其关闭,但这不是您的问题...
这是我实现自定义 UIBarButtonItem 的方式:
...界面:
@interface ixPopoverBarButtonItem : UIBarButtonItem
- (void) showingPopover: (UIPopoverController *)popoverController;
@end
...并暗示:
#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:我是ARC新手,所以我不完全确定我是否在这里泄漏。请告诉我,如果我...