【问题标题】:How to collapse ViewController in UISplitViewController如何在 UISplitViewController 中折叠 ViewController
【发布时间】:2015-06-01 07:43:41
【问题描述】:

我有一个SplitViewController 我已经在代码中实例化了。

masterVC = [[MasterViewController alloc] init];
DetailViewController *detailVC = [[DetailViewController alloc] init];
masterVC.detailViewController = [[UINavigationController alloc] initWithRootViewController:detailVC];
...
_splitViewController =  [[UISplitViewController alloc] init];
_navigationController = [[UINavigationController alloc] initWithRootViewController:masterVC];
...
_splitViewController.viewControllers = @[_navigationController, masterVC.detailViewController];
_splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
...
self.window.rootViewController = _splitViewController;

90% 的时间我都希望 ViewControllers 都像在设置应用程序中一样显示,这就是这样做的。但是现在有些情况下,我希望将左侧 _navigationController 的可见性切换几分钟,然后再返回默认的 2 列设置。

如何折叠左侧?我能想到的唯一方法是重新定义self.window.rootViewController 并将其设置为masterVC.detailViewController

难道没有更“灵活”的方式吗?

谢谢

【问题讨论】:

    标签: objective-c ios8 uisplitviewcontroller master-detail


    【解决方案1】:

    您可以使用显示模式按钮项来隐藏或显示母版。

    detailViewController.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
    detailViewController.navigationItem.leftItemsSupplementBackButton = YES;
    

    主从项目提供了折叠 splitViewController 的示例代码。详情请参阅UISplitViewControllerDelegate

    更新:

    这是您询问的请求的委托代码:

    - (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {
        if ([secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]] && ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil)) {
            // Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
            return YES;
        } else {
            return NO;
        }
    }
    
    - (UIViewController *)splitViewController:(UISplitViewController *)splitViewController
    separateSecondaryViewControllerFromPrimaryViewController:(UIViewController *)primaryViewController{
    
        if ([primaryViewController isKindOfClass:[UINavigationController class]]) {
            for (UIViewController *controller in [(UINavigationController *)primaryViewController viewControllers]) {
                if ([controller isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)controller visibleViewController] isKindOfClass:[NoteViewController class]]) {
                    return controller;
                }
            }
        }
    
        // No detail view present
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UINavigationController *detailView = [storyboard instantiateViewControllerWithIdentifier:@"detailView"];
    
        // Ensure back button is enabled
        UIViewController *controller = [detailView visibleViewController];
        controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
        controller.navigationItem.leftItemsSupplementBackButton = YES;
    
        return detailView;
    
    }
    

    【讨论】:

    • 能否请您链接到您所指的代码示例。 UISplitViewController 文档中链接的那些没有此功能。
    • 发布的代码对您来说效果如何?应用现在是否按照您想要的方式运行?
    • 不,不是。我现在通过创建leftBarButtonItems 调用方法来检查正在使用的displayMode,然后在UISplitViewControllerDisplayModeAllVisibleUISplitViewControllerDisplayModePrimaryOverlay 之间切换displayMode
    • 您是否将前两行代码添加到您的详细信息序列中,以便可以看到内置的 displayMode 按钮?
    • 是的 - 我还尝试使用 NSHipster 中的示例重建它。也许这个问题是我没有使用 Storyboards 和 Segues。我正在手动编写视图。
    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 2015-12-15
    • 2020-04-20
    • 2020-01-02
    • 2022-01-11
    • 1970-01-01
    • 2021-05-12
    • 2018-04-27
    相关资源
    最近更新 更多