UISplitviewController 和不同的 UIKeyCommands 取决于主控、细节或两者都在屏幕上

UISplitviewController and different UIKeyCommands depending on master, detail or both being on screen

我想在我的应用程序中包含一些 UIKeyCommands。我的应用程序包含一个 UISplitViewController,它强制主程序在 iPad 全屏上始终可见。在较小的屏幕上,它像往常一样工作。

现在,我已经在 MasterViewControllerDetailViewController 中实现了一些 UIKeyCommands。但是,该应用程序只会显示 DetailViewController 中的内容。所以我将它们全部放在 RootSplitViewController 中,但这会显示所有这些,即使 MasterViewController 隐藏在 iOS 9 的 splitview 中。

我想要的是当应用程序在 iPad 上全屏时显示所有内容,因此 MasterViewControllerDetailViewController 一起强制显示在屏幕上。当视图很小(即 50-50)并且 MasterViewController 被隐藏时,我希望它只显示屏幕上 window 的视图。

关于如何实现这一点有什么想法吗?

最后我设法做到了这一点 - 尽管是以一种不太漂亮的方式。

UIKeyCommands 添加到 RootSplitViewController

- (NSArray *)keyCommands {
    if (self.view.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) {
        return @[
                    [UIKeyCommand keyCommandWithInput:@"r" modifierFlags:UIKeyModifierCommand action:@selector(changeRestaurant:) discoverabilityTitle:@"Change restaurant"],
                    [UIKeyCommand keyCommandWithInput:@"t" modifierFlags:UIKeyModifierCommand action:@selector(changeTable:) discoverabilityTitle:@"Change table"]
                ];
    } else {
        if (self.masterIsVisible == YES) {
            return @[
                         [UIKeyCommand keyCommandWithInput:@"t" modifierFlags:UIKeyModifierCommand action:@selector(changeRestaurant:) discoverabilityTitle:@"Change restaurant"]
                    ];
        } else {
            return @[
                         [UIKeyCommand keyCommandWithInput:@"t" modifierFlags:UIKeyModifierCommand action:@selector(changeTable:) discoverabilityTitle:@"Change table"]
                    ];
        }
    }
}

那些方法调用了具体UIViewController中的实际方法。

- (void)changeRestaurant:(id)sender {
    UINavigationController *nav = (UINavigationController *)[self.viewControllers objectAtIndex:0];
    RestaurantController *master = [nav.viewControllers objectAtIndex:0];
    [master changeRestaurant];
}

- (void)changeTable:(id)sender {
    UINavigationController *nav = (UINavigationController *)[self.viewControllers objectAtIndex:1];
    TableController *detail = [nav.viewControllers objectAtIndex:0];
    [detail changeTable:sender];
}

为了让它起作用,我在 UISplitViewController 中添加了一个 BOOL

@interface RootSplitViewController : UISplitViewController

@property (nonatomic) BOOL masterIsVisible;

@end

然后在 MasterViewController.

中调用
- (void)viewDidDisappear:(BOOL)animated {
    RootSplitViewController *rootView = (RootSplitViewController *)self.splitViewController;
    rootView.masterIsVisible = NO;
}

- (void)viewDidAppear:(BOOL)animated {
    RootSplitViewController *rootView = (RootSplitViewController *)self.splitViewController;
    rootView.masterIsVisible = YES;
}

我知道这可能不是漂亮的方法,但它确实有效。如果有人知道更好的方法,我很乐意听取您的反馈。