我解决了它创建一个自定义 ixPopoverBarButtonItem
,它可以触发搜索或消除显示的弹出窗口。
我的工作:我切换按钮的操作和目标,因此它会触发搜索或处理当前显示的弹出窗口。
我花了很多时间来寻找这个解决方案,我不想因为切换动作而获得赞誉。将代码放在自定义按钮中是我尽量减少样例代码在我看来的方法。
在情节提要中,我将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的新手,所以我不确定我是否在这里泄漏。请告诉我我是否...