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

Posted

技术标签:

【中文标题】UISplitviewController 和不同的 UIKeyCommands 取决于主、细节或两者都在屏幕上【英文标题】:UISplitviewController and different UIKeyCommands depending on master, detail or both being on screen 【发布时间】:2016-07-24 14:39:22 【问题描述】:

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

现在,我在MasterViewController 中实现了一些UIKeyCommands,在DetailViewController 中实现了一些。但是,该应用程序只会显示DetailViewController 中的那些。所以我将它们全部放在RootSplitViewController 中,但这会显示所有这些,即使MasterViewController 隐藏在ios 9 的拆分视图中。

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

关于如何实现这一点的任何想法?

【问题讨论】:

【参考方案1】:

最后我设法做到了——尽管方式并不那么漂亮。

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;

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

【讨论】:

以上是关于UISplitviewController 和不同的 UIKeyCommands 取决于主、细节或两者都在屏幕上的主要内容,如果未能解决你的问题,请参考以下文章

将 UIToolBar 放在 UISplitViewController 上方?

在 UIViewControllers 和 UISplitViewController 之间导航 [关闭]

iPad 上的 UITraitCollection 和 UISplitViewController

UISplitViewController 一致分隔符

故事板、UIViewController 和 UISplitViewController

UISplitViewController 和单元格取消选择