を使用するアプリケーションがありますUISplitViewController
。デリゲートを追加し、アプリがポートレート モードのときにナビゲーション バーにボタンを割り当てて、マスター ビュー コントローラーをポップオーバー ビューで表示できるようにします。
/*
@property (strong, nonatomic) id detailItem;
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
*/
#pragma mark - Managing the detail item
- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;
// do smth
}
if (self.masterPopoverController != nil) {
[self.masterPopoverController dismissPopoverAnimated:YES];
}
}
#pragma mark - UISplitViewDelegate methods
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.title = NSLocalizedString(@"", @"");
UIImage *imag = [[UIImage imageNamed:@"gray_button"]resizableImageWithCapInsets:UIEdgeInsetsMake(0, 7, 0, 7)];
UIImage *imag_pressed = [[UIImage imageNamed:@"gray_button_pressed"]resizableImageWithCapInsets:UIEdgeInsetsMake(0, 7, 0, 7)];
UIImage *more = [UIImage imageNamed:@"shows_button_pressed.png"];
[barButtonItem setBackgroundImage:imag forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[barButtonItem setBackgroundImage:imag_pressed forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
[barButtonItem setImage:more];
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.masterPopoverController = popoverController;
}
- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
self.masterPopoverController = nil;
}
マスター ビュー コントローラーでオプションが選択されている場合、RootViewController (基本的に分割ビュー コントローラーの詳細分割) は、置換タイプのセグエで変更されます。もう一度、UISplitViewController
代理人を割り当てます。私の問題は、デバイスを横向きモードにしてから縦向きに戻さない限り、ルートが変更された後にバーボタンが表示されないことです。そうすれば、ボタンがそこにあり、それが機能します。
デバイスを横向きにしてから縦向きに戻さずにボタンを表示するにはどうすればよいですか?
prepareForSegue:
PS:古いルート ビュー コントローラーのメソッドに新しいデリゲートを割り当てることと、新しいルート ビュー コントローラーのメソッドに新しいデリゲートを割り当てることの両方を試みましたviewWillAppear:
。同じことが起こります。別のこと:新しいルートView Controllerは<UISplitViewControllerDelegate>
アップデート :
メソッド :- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
は、横向きから縦向きに移動した後にのみ呼び出されることがわかったので、ボタンを表示するにはデバイスを回転させる必要があります。
2 つのデリゲートの違いは、最初のデリゲートが my に追加され、AppDelegate.m
2 番目のデリゲートがprepareForSegue:
古いルート ビュー コントローラーのメソッドに追加されることです。上記のメソッドは、アプリが起動するとすぐに古いルート ビュー コントローラーに対して呼び出されます。