【问题标题】:UISplitViewController willHideViewController/willShowViewController not called after forcing detail view to be hidden强制隐藏详细视图后未调用 UISplitViewController willHideViewController/willShowViewController
【发布时间】:2012-03-13 18:30:20
【问题描述】:

我有一个 iPad 应用程序,它使用 UISplitViewController 作为根控制器,我已经设置了委托,并且我正在为 DetailView 使用 UINavigationController,它似乎可以正常工作。

当 DetailView 部分中显示特定视图控制器时,我希望 MasterViewContoller 始终隐藏(在所有旋转中)。我可以使用 UISplitViewController Delegate 上的 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;
    }

}

}

【问题讨论】:

    标签: objective-c ipad uisplitviewcontroller


    【解决方案1】:

    我遇到了一个非常相似的问题,将 Apple 的示例代码与 SubstitutableDetailViewController 委托结合使用旋转。

    我所做的是存储一个BOOL 用于当方向为横向时,使用以下代码在willRotateToInterfaceOrientation 上更新它:

    isLandscape = UIInterfaceOrientationIsLandscape(self.interfaceOrientation);

    viewWillAppear我检查了当前方向是否为横向,如果与存储的值不匹配,则调用此方法:

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

    主视图控制器(左侧)正在维护对 rootPopoverButtonItem 的引用,这使得这项工作正常进行。

    编辑:请注意,我还在 viewDidLoadwillRotateToInterfaceOrientation 上调用了我的 adjustLayoutForOrientation 方法...更好的方法可能是在通知中心注册,但我没有确定背景/不可见视图控制器是否会收到这些通知...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多