Objective c 强制隐藏细节视图后未调用UISplitViewController willHideViewController/willShowViewController
我有一个iPad应用程序,它使用UISplitViewController作为根控制器,我已经设置了代理,我使用UINavigationController作为详细视图,它似乎工作正常 我希望在DetailView区域中显示特定的viewcontroller时,MasterViewController始终处于隐藏状态(在所有旋转中)。我可以使用UISplitViewController委托上的shouldHideViewController方法来完成此操作 但是,如果这样做,则当我将DetailView部分中的ViewController更改为另一个时,将显示主视图,但在代理中既不调用willHideViewController也不调用willShowViewController 如果我旋转设备并将其旋转回去,则会调用它们,并按预期工作,但在设备旋转并旋转回原始方向之前不会调用它们 这会导致主视图显示后的第一次旋转中不显示弹出按钮Objective c 强制隐藏细节视图后未调用UISplitViewController willHideViewController/willShowViewController,objective-c,ipad,uisplitviewcontroller,Objective C,Ipad,Uisplitviewcontroller,我有一个iPad应用程序,它使用UISplitViewController作为根控制器,我已经设置了代理,我使用UINavigationController作为详细视图,它似乎工作正常 我希望在DetailView区域中显示特定的viewcontroller时,MasterViewController始终处于隐藏状态(在所有旋转中)。我可以使用UISplitViewController委托上的shouldHideViewController方法来完成此操作 但是,如果这样做,则当我将Detail
- (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];
}
}我遇到了一个非常类似的问题,将苹果的示例代码与
SubstitutableDetailViewController
委托和旋转结合使用
我所做的是为方向为横向时存储一个BOOL
,并使用以下代码在willRotateToInterfaceOrientation
上更新它:
isLandscape=UIInterfaceOrientationIsLandscape(self.interfaceOrientation)代码>
在viewwillbeen
上,我检查了当前方向是否为横向,如果与存储的值不匹配,则调用此方法:
-(void)adjustLayoutForOrientation{
if (isLandscape) {
[self invalidateRootPopoverButtonItem: self.navigationController.navigationItem.leftBarButtonItem];
}else{
LeftViewController *lvc = (LeftViewController *)[self.splitViewController delegate];
[self showRootPopoverButtonItem: lvc.rootPopoverButtonItem ];
}
}
显然,我使用的是Apple提供的委派代码,但为了完整起见,这些方法如下所示,并且可以轻松实现:
#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];
}
主视图控制器(左侧)正在维护对rootpopovoverbuttonItem
的引用,这使得此功能得以实现
编辑:请注意,我还在viewdiload
上调用我的adjustLayoutForOrientation
方法,并且将旋转到InterfaceOrientation
。。。更好的方法可能是向通知中心注册,但我不确定后台/不可见视图控制器是否会收到这些通知
-(void)adjustLayoutForOrientation{
if (isLandscape) {
[self invalidateRootPopoverButtonItem: self.navigationController.navigationItem.leftBarButtonItem];
}else{
LeftViewController *lvc = (LeftViewController *)[self.splitViewController delegate];
[self showRootPopoverButtonItem: lvc.rootPopoverButtonItem ];
}
}
#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];
}