私は、ルートコントローラとしてUISplitViewControllerを使用するiPadアプリケーションを持っています。デリゲートを設定しました。通常は。UISplitViewController willHideViewController/willShowViewControllerは、詳細ビューを隠すように強制した後に呼び出されません。
特定のviewcontrollerがDetailViewセクションに表示されているときに、MasterViewContollerを常に(すべての回転で)非表示にします。私はUISplitViewControllerデリゲートのshouldHideViewControllerメソッドを使ってこれを行うことができます。
しかし、そうするとDetailViewセクションのViewControllerを別のものに変更すると、MasterViewが表示されますが、willHideViewController/willShowViewControllerもデリゲートで呼び出されません。
デバイスを回転して戻すと、呼び出されて正常に動作しますが、デバイスが回転して元の向きに戻されるまで呼び出されません。
これにより、MasterViewが表示された後、最初の回転でポップオーバーボタンが表示されなくなります。
- (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc {
// Keep references to the popover controller and the popover button, and tell the detail view controller to show the button.
barButtonItem.title = @"Survey Sections";
self.popoverController = pc;
self.rootPopoverButtonItem = barButtonItem;
UIViewController <SubstitutableDetailViewController> *detailViewController = [self.splitViewController.viewControllers objectAtIndex:1];
if ([detailViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController *detailNavController = (UINavigationController *)detailViewController;
[[detailNavController.viewControllers objectAtIndex:0] showRootPopoverButtonItem:rootPopoverButtonItem];
}
}
- (void)splitViewController:(UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
// Nil out references to the popover controller and the popover button, and tell the detail view controller to hide the button.
UIViewController <SubstitutableDetailViewController> *detailViewController = [self.splitViewController.viewControllers objectAtIndex:1];
if ([detailViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController *detailNavController = (UINavigationController *)detailViewController;
[[detailNavController.viewControllers objectAtIndex:0] invalidateRootPopoverButtonItem:rootPopoverButtonItem];
}
self.popoverController = nil;
self.rootPopoverButtonItem = nil;
}
- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
UIViewController *detailViewController = [svc.viewControllers objectAtIndex:1];
if ([detailViewController isMemberOfClass:[MySurveysViewController class]]) {
return YES;
}else {
if (UIInterfaceOrientationIsLandscape(orientation)) {
return NO;
}else {
return YES;
}
}
}