2013年12月15日日曜日

今回は、iPadのプログラマーな方むけのとっても技術的なハナシです

iPadのUIPopoverを できるだけStoryboardを有効活用して作る場合のお話です。
(なお、Storyboardを使わないパターンは UIPopoverControllerチュートリアル その2 などが参考になりました。)


以下が最善の策かは分かりませんが、とりあえず動いているし、いろいろググって調べたものと比較しても簡単です。



■StoryboardでUIPopoverを設定する
SegueにIdをつけて、StyelはPopoverを選びます。これで接続されたUIViewController(destinationViewController)が Popoverで開きます。

でも、これだけだと

  • 自分自身の多重起動も含め、同時に二つ以上のPopoverが表示されます。
  • 閉じるボタンを作れない

という問題があります。


■Popoverを呼び出す UIViewControllerで解決する
呼び出し元のUIViewControllerに -(void)prepareForSegue: sender:を追加し、その中で

  1. staticなUIPopoverController変数を定義し、Popoverの二重起動を防ぐ
  2. Popoverで開かれるUIViewControllerにPopoverControllerを通知しておく
  3. 上記2つの処理はsegueがUIStoryboardPopoverSegueクラスの時に実施する

を行います。 あとは、呼び出されるUIViewControllerから PopoverControllerが参照されるので、 [self.popc dismissPopoverAnimated:YES] ; とすれば消すこともできます。


ソースも付けておきます。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    static UIPopoverController* popoc = nil;
   
    if ([[segue identifier] isEqualToString:@"SplitViewFlip"]) {
        MasterViewController* mvc = [((UISplitViewController*)
                                 [segue destinationViewController]).viewControllers objectAtIndex:0] ;
        // mvc関連のデータ受け渡しをする
    }
    else if ([segue isKindOfClass:[UIStoryboardPopoverSegue class]]) {
        if ( popoc )
            [popoc dismissPopoverAnimated:NO] ;
        popoc = ((UIStoryboardPopoverSegue*)segue).popoverController ;
        if ( [segue.identifier isEqualToString:@"PlanPopover"]) {
            PlanViewController* pvc =(PlanViewController*)[segue destinationViewController] ;
            pvc.popc = popoc ;
        }
    }
}


Tagged: ,

0 コメント: