Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 强制隐藏细节视图后未调用UISplitViewController willHideViewController/willShowViewController_Objective C_Ipad_Uisplitviewcontroller - Fatal编程技术网

Objective c 强制隐藏细节视图后未调用UISplitViewController willHideViewController/willShowViewController

Objective c 强制隐藏细节视图后未调用UISplitViewController willHideViewController/willShowViewController,objective-c,ipad,uisplitviewcontroller,Objective C,Ipad,Uisplitviewcontroller,我有一个iPad应用程序,它使用UISplitViewController作为根控制器,我已经设置了代理,我使用UINavigationController作为详细视图,它似乎工作正常 我希望在DetailView区域中显示特定的viewcontroller时,MasterViewController始终处于隐藏状态(在所有旋转中)。我可以使用UISplitViewController委托上的shouldHideViewController方法来完成此操作 但是,如果这样做,则当我将Detail

我有一个iPad应用程序,它使用UISplitViewController作为根控制器,我已经设置了代理,我使用UINavigationController作为详细视图,它似乎工作正常

我希望在DetailView区域中显示特定的viewcontroller时,MasterViewController始终处于隐藏状态(在所有旋转中)。我可以使用UISplitViewController委托上的shouldHideViewController方法来完成此操作

但是,如果这样做,则当我将DetailView部分中的ViewController更改为另一个时,将显示主视图,但在代理中既不调用willHideViewController也不调用willShowViewController

如果我旋转设备并将其旋转回去,则会调用它们,并按预期工作,但在设备旋转并旋转回原始方向之前不会调用它们

这会导致主视图显示后的第一次旋转中不显示弹出按钮

- (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];
}