今回は、iPadのプログラマーな方むけのとっても技術的なハナシです
iPadのUIPopoverを できるだけStoryboardを有効活用して作る場合のお話です。
(なお、Storyboardを使わないパターンは UIPopoverControllerチュートリアル その2 などが参考になりました。)
以下が最善の策かは分かりませんが、とりあえず動いているし、いろいろググって調べたものと比較しても簡単です。
■StoryboardでUIPopoverを設定する
SegueにIdをつけて、StyelはPopoverを選びます。これで接続されたUIViewController(destinationViewController)が Popoverで開きます。
でも、これだけだと
という問題があります。
■Popoverを呼び出す UIViewControllerで解決する
呼び出し元のUIViewControllerに -(void)prepareForSegue: sender:を追加し、その中で
を行います。 あとは、呼び出されるUIViewControllerから PopoverControllerが参照されるので、 [self.popc dismissPopoverAnimated:YES] ; とすれば消すこともできます。
ソースも付けておきます。
iPadのUIPopoverを できるだけStoryboardを有効活用して作る場合のお話です。
(なお、Storyboardを使わないパターンは UIPopoverControllerチュートリアル その2 などが参考になりました。)
以下が最善の策かは分かりませんが、とりあえず動いているし、いろいろググって調べたものと比較しても簡単です。
■StoryboardでUIPopoverを設定する
SegueにIdをつけて、StyelはPopoverを選びます。これで接続されたUIViewController(destinationViewController)が Popoverで開きます。
でも、これだけだと
- 自分自身の多重起動も含め、同時に二つ以上のPopoverが表示されます。
- 閉じるボタンを作れない
という問題があります。
■Popoverを呼び出す UIViewControllerで解決する
呼び出し元のUIViewControllerに -(void)prepareForSegue: sender:を追加し、その中で
- staticなUIPopoverController変数を定義し、Popoverの二重起動を防ぐ
- Popoverで開かれるUIViewControllerにPopoverControllerを通知しておく
- 上記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 ; } } }
0 コメント:
コメントを投稿