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, но он работает. Если кто-нибудь знает лучший способ сделать это, я хотел бы услышать ваши отзывы.

Другие вопросы по тегам