UISplitviewController 和不同的 UIKeyCommands 取决于主控、细节或两者都在屏幕上
UISplitviewController and different UIKeyCommands depending on master, detail or both being on screen
我想在我的应用程序中包含一些 UIKeyCommands
。我的应用程序包含一个 UISplitViewController
,它强制主程序在 iPad 全屏上始终可见。在较小的屏幕上,它像往常一样工作。
现在,我已经在 MasterViewController
和 DetailViewController
中实现了一些 UIKeyCommands
。但是,该应用程序只会显示 DetailViewController
中的内容。所以我将它们全部放在 RootSplitViewController
中,但这会显示所有这些,即使 MasterViewController
隐藏在 iOS 9 的 splitview 中。
我想要的是当应用程序在 iPad 上全屏时显示所有内容,因此 MasterViewController
与 DetailViewController
一起强制显示在屏幕上。当视图很小(即 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;
}
我知道这可能不是漂亮的方法,但它确实有效。如果有人知道更好的方法,我很乐意听取您的反馈。
我想在我的应用程序中包含一些 UIKeyCommands
。我的应用程序包含一个 UISplitViewController
,它强制主程序在 iPad 全屏上始终可见。在较小的屏幕上,它像往常一样工作。
现在,我已经在 MasterViewController
和 DetailViewController
中实现了一些 UIKeyCommands
。但是,该应用程序只会显示 DetailViewController
中的内容。所以我将它们全部放在 RootSplitViewController
中,但这会显示所有这些,即使 MasterViewController
隐藏在 iOS 9 的 splitview 中。
我想要的是当应用程序在 iPad 上全屏时显示所有内容,因此 MasterViewController
与 DetailViewController
一起强制显示在屏幕上。当视图很小(即 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;
}
我知道这可能不是漂亮的方法,但它确实有效。如果有人知道更好的方法,我很乐意听取您的反馈。