2012-02-23 16 views
2

私は、ルートコントローラとして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; 
    } 

} 

}

答えて

1

Iは、回転と組み合わさSubstitutableDetailViewControllerデリゲートでAppleのサンプルコードを使用して、非常に同様の問題を抱えていました。私は現在の向きが横であるかどうかをチェックし、それがなかった場合viewWillAppear

isLandscape = UIInterfaceOrientationIsLandscape(self.interfaceOrientation);

を:どのような向きは、このコードでwillRotateToInterfaceOrientationでそれを更新し、風景だったとき私はBOOLを保存してなかった

私は、Appleが提供する委任コードを使用していますが、完全を期すために、それらが満たさ

明らか
-(void)adjustLayoutForOrientation{ 
    if (isLandscape) { 
     [self invalidateRootPopoverButtonItem: self.navigationController.navigationItem.leftBarButtonItem]; 
}else{ 
     LeftViewController *lvc = (LeftViewController *)[self.splitViewController delegate]; 
     [self showRootPopoverButtonItem: lvc.rootPopoverButtonItem ]; 
    } 
} 

:このメソッドと呼ばれる格納された値と一致しませんhodsは、これらのであり、容易に実現できる。

#pragma mark - 
#pragma mark Managing the popover 

- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem { 
    // Add the popover button to the left navigation item. 
    [self.navigationController.navigationBar.topItem setLeftBarButtonItem:barButtonItem animated:NO]; 
} 


- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem { 
    // Remove the popover button. 
    [self.navigationController.navigationBar.topItem setLeftBarButtonItem:nil animated:NO]; 
} 

マスター・ビュー・コントローラ(左側)は、この作業を行うrootPopoverButtonItemへの参照を維持することです。

EDIT:私もviewDidLoadwillRotateToInterfaceOrientation ...に私のadjustLayoutForOrientationメソッドを呼び出していることに注意してくださいより良い方法は、通知センターに登録することかもしれませんが、背景/不可視のビューコントローラはこれらになるだろうかどうかはわかりませんでした通知...

関連する問題