私は今夜、これと同じ問題に直面しました。いくつかの回避策があります(ポップオーバーを昔ながらの方法で提示することを含む)。
この例では、カスタムセルクラスに格納されているオブジェクトがあります。セルが選択されたら、このような関数を呼び出して、オブジェクトに関するpopOverViewControllerの詳細を開き、テーブル内の対応するセルをポイント(アンカー)します。
- (void)openCustomPopOverForIndexPath:(NSIndexPath *)indexPath{
CustomViewController* customView = [[self storyboard] instantiateViewControllerWithIdentifier:@"CustomViewController"];
self.myPopOver = [[UIPopoverController alloc]
initWithContentViewController:customView];
self.myPopOver.delegate = self;
//Get the cell from your table that presents the popover
MyCell *myCell = (MyCell*)[self.tableView cellForRowAtIndexPath:indexPath];
CGRect displayFrom = CGRectMake(myCell.frame.origin.x + myCell.frame.size.width, myCell.center.y + self.tableView.frame.origin.y - self.tableView.contentOffset.y, 1, 1);
[self.myPopOver presentPopoverFromRect:displayFrom
inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
この方法の問題は、カスタム初期化子を持つためにポップオーバービューが必要になることが多いことです。これは、ビューをxibではなくストーリーボードで設計し、セルに関連付けられたオブジェクトをその表示に使用するパラメーターとして受け取るカスタムinitメソッドを使用する場合に問題になります。また、動的なアンカーポイントが必要なため(一見したところ)、ポップオーバーセグエを使用することはできません(セルのプロトタイプにアンカーすることはできません)。これが私がしたことです:
- まず、ViewControllerビューに非表示の1pxX1pxUIButtonを作成します。(ビュー内の任意の場所に移動できるようにするボタンの制約を与えることが重要です)
- 次に、View Controllerにボタン(私は私のpopOverAnchorButtonと呼びます)のアウトレットを作成し、セグエを非表示のボタンからセグエしたいViewControllerにドラッグします。それをpopOverセグエにします。
これで、「合法的な」アンカーを備えたポップオーバーセグエができました。ボタンは非表示になっているため、誤ってボタンに触れることはありません。これはアンカーポイントにのみ使用しています。
このように、関数で手動でセグエを呼び出します。
- (void)openCustomPopOverForIndexPath:(NSIndexPath *)indexPath{
//Get the cell from your table that presents the popover
MyCell *myCell = (MyCell*)[self.tableView cellForRowAtIndexPath:indexPath];
//Make the rect you want the popover to point at.
CGRect displayFrom = CGRectMake(myCell.frame.origin.x + myCell.frame.size.width, myCell.center.y + self.tableView.frame.origin.y - self.tableView.contentOffset.y, 1, 1);
//Now move your anchor button to this location (again, make sure you made your constraints allow this)
self.popOverAnchorButton.frame = displayFrom;
[self performSegueWithIdentifier:@"CustomPopoverSegue" sender:myCell];
}
そして……出来上がり。今、あなたはセグエの魔法をすべての素晴らしさで使用していて、あなたはあなたの細胞を指しているように見える動的なアンカーポイントを持っています。これで-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
、送信者をセルのクラスにキャストし(送信者のタイプと呼び出されているセグエを適切にチェックする場合)、セグエのdestinationViewControllerにセルのオブジェクトを指定できます。
これが役立つかどうか、または誰かがフィードバックや改善を持っているかどうかを教えてください。