UISplitviewController и различные UIKeyCommands в зависимости от мастера, детали или того и другого на экране
Я хочу включить некоторые UIKeyCommands
в моем приложении. Мое приложение состоит из одного UISplitViewController
Это заставляет мастера всегда быть видимым на iPad во весь экран. На меньшем экране это работает как обычно.
Теперь я реализовал некоторые UIKeyCommands
в MasterViewController
а некоторые в DetailViewController
, Тем не менее, приложение будет показывать только те, в DetailViewController
, Поэтому я положил их все в RootSplitViewController
, но это покажет их всех, даже когда MasterViewController
скрыт в сплитвью iOS 9.
Что я хочу, так это чтобы он показывал все, когда приложение полноэкранно на iPad и, таким образом, MasterViewController
вынужден на экране вместе с DetailViewController
, И когда вид маленький (то есть 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];
}
Чтобы это работало, я добавил BOOL
к UISplitViewController
,
@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, но он работает. Если кто-нибудь знает лучший способ сделать это, я хотел бы услышать ваши отзывы.