2016-07-24 10 views
1

UIKeyCommandsを自分のアプリに含める必要があります。私のアプリは1台のUISplitViewControllerで構成されているので、マスターを常にiPadのフルスクリーンで見ることができます。小さな画面では通常のように機能します。UISplitviewControllerと異なるUIKeyCommands(マスター、詳細、または両方が画面に表示されます)

UIKeyCommandsMasterViewControllerに、また一部をDetailViewControllerに実装しました。ただし、アプリに表示されるのはDetailViewControllerのみです。だから私はすべてRootSplitViewControllerに入れていますが、MasterViewControllerがiOS 9のsplitviewに隠されていても、それらのすべてが表示されます。

私が欲しいのは、アプリがiPad上で全画面表示されているため、MasterViewControllerDetailViewControllerと一緒に画面に表示されていることです。ビューが小さく(つまり50-50)、MasterViewControllerが非表示になっている場合は、画面に表示されているウィンドウのみを表示します。

これを達成するためのアイデアはありますか?

答えて

1

結局私はこれをやっていましたが、それほど美しい方法ではありませんでした。

UIKeyCommandsRootSplitViewControllerに追加されています。

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

私はUISplitViewControllerBOOLを追加しました。

@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; 
} 

私はこれが美味しさの方法ではないかもしれないことは知っていますが、機能します。誰かがもっと良い方法を知っているなら、私はあなたのフィードバックを聞いて欲しいです。

関連する問題