0

iOS 6 で正常に動作するカスタム ストーリー ボード セグエを実装しましたが、iOS 5.1 のシミュレーターでは何も起こりません。問題は、iOS 5.1 で popoverController が常に nil になることです!

@implementation PopoverFromRectSegue  

-(id)initWithIdentifier:(NSString *)identifier
             source:(UIViewController *)source
        destination:(UIViewController *)destination {

  if(self = [super initWithIdentifier:identifier
                             source:source
                        destination:destination]) {
  }

  return self;
}

- (void)perform {
    UIPopoverController *popCtrl = ((UIStoryboardPopoverSegue *)self).popoverController;

    id controller = [self sourceViewController];
    if ([controller isKindOfClass:[UIViewController class]] && [controller respondsToSelector:@selector(popoverRect)]) {
    [popCtrl presentPopoverFromRect:[[controller performSelector:@selector(popoverRect)] CGRectValue] inView:[controller view] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
  }
}
@end

ヘルプ/ヒントをいただければ幸いです。

編集:新しいサンプルプロジェクトを作成しました。iOS5.1 では popoverController がカスタム UIStoryBoardSegues に設定されていないようです。他に何ができますか。通常のポップオーバーにはアンカーが必要ですが、プロトタイプの tableView セルは受け入れられず (コンパイル中の失敗)、ポップオーバーが表示される四角形を変更する方法が見つかりませんでした。

4

1 に答える 1

0

これが私の回避策です。
PopoverFromRectSegue.h

@interface PopoverFromRectSegue : UIStoryboardPopoverSegue
  @property (strong, nonatomic) UIPopoverController *popoverCtrl;
@end

PopoverRectFromSegue.m

#import "PopoverFromRectSegue.h"
@implementation PopoverFromRectSegue

- (void)perform
{
  UIPopoverController *popCtrl = ((UIStoryboardPopoverSegue *)self).popoverController;

  // under iOS 5.1 the popoverController iVar is not set
  // so we have to use our own one
  if (nil == popCtrl) {
    popCtrl = self.popoverCtrl;
  }

  id controller = [self sourceViewController];
  if ([controller isKindOfClass:[UIViewController class]] && [controller respondsToSelector:@selector(popoverRect)]) {
    [popCtrl presentPopoverFromRect:[[controller performSelector:@selector(popoverRect)] CGRectValue] inView:[controller view] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
  }
}

@end

私の prepareForSegue メソッドでは、次のことを行います。

    if (isPad) {
      self.popoverCtrl = [(UIStoryboardPopoverSegue *)segue popoverController];
      if (nil == _popoverCtrl) {
        self.popoverCtrl = [[UIPopoverController alloc] initWithContentViewController:[segue destinationViewController]];
        ((PopoverFromRectSegue *)segue).popoverCtrl = _popoverCtrl;
      }
      self.popoverRect = [NSValue valueWithCGRect:[self.myTableView rectForRowAtIndexPath:indexPath]];
  }
于 2012-12-12T11:04:57.230 に答える