ixPopoverBarButtonItem
セグエをトリガーするか、表示されているポップオーバーを閉じるカスタムを作成して解決しました。
私がすること: ボタンのアクションとターゲットを切り替えて、セグエをトリガーするか、現在表示されているポップオーバーを破棄します。
このソリューションには多くのグーグル検索が必要でした。アクションを切り替えるというアイデアの功績を認めたくありません。コードをカスタム ボタンに配置することは、ボイラープレート コードを最小限に抑えるための私のアプローチでした。
ストーリーボードで、BarButtonItem のクラスをカスタム クラスに定義します。

次に、セグエによって作成されたポップオーバーを、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 を初めて使用するので、ここで漏れているかどうかは完全にはわかりません。私がそうであるかどうか教えてください...