正如 Rob 所建议的,标签栏控制器将为您的设计提供良好的组织原则。
将 UITabBarController 添加到情节提要中,并为其指定情节提要 iD。将三组 viewController(及其各自的 navController)中的每一组分配给 tabBarController 中的选项卡项。
UITabBarController
|--> UINavigationController --> VC1 ---> VC2 -->
|--> UINavigationController --> VC1 ---> VC2 -->
|--> UINavigationController --> VC1 ---> VC2 -->
在您的应用程序委托中,创建一个强大的属性来保存选项卡栏控制器的指针。由于选项卡栏控制器保留指向其所有选项卡项的指针,因此这将处理每组视图控制器的状态。您不必为它们中的任何一个保留单独的指针,并且可以通过 tabBarController 获取对它们的引用viewControllers
财产。
@property (strong, nonatomic) UITabBarController* tabVC;
启动时初始化它
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIStoryboard storyBoard =
[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
self.tabVC = [storyBoard instantiateViewControllerWithIdentifier:@"tabVC"];
//hide the tab bar
for (UINavigationController* navController in self.tabVC.viewControllers)
[navController.viewControllers[0] setHidesBottomBarWhenPushed:YES];
return YES;
}
隐藏选项卡栏的另一种方法是在每个(初始)视图控制器的属性检查器中选中“按下时隐藏底部栏”框。您不必对后续视图控制器执行此操作,只需在该选项卡项中看到的第一个视图控制器即可。
然后,当您需要导航到您的 navController 组之一时……
- (IBAction)openTab:(UIButton*)sender {
AppDelegate* appDelegate =
(AppDelegate*)[[UIApplication sharedApplication] delegate];
if ([sender.titleLabel.text isEqualToString: @"Option 1"]) {
appDelegate.tabVC.selectedIndex = 0;
}else if ([sender.titleLabel.text isEqualToString: @"Option 2"]){
appDelegate.tabVC.selectedIndex = 1;
}else if ([sender.titleLabel.text isEqualToString: @"Option 3"]){
appDelegate.tabVC.selectedIndex = 2;
}
[self presentViewController:appDelegate.tabVC
animated:YES completion:nil];
}
(本例使用presentViewController
,您的应用程序设计可能会以其他方式导航......)
update
如果您想在没有选项卡栏控制器的情况下执行此操作,则可以实例化一个包含指向每个导航控制器的指针的数组:
UINavigationController* ncA =
[storyboard instantiateViewControllerWithIdentifier:@"NCA"];
UINavigationController* ncB =
[storyboard instantiateViewControllerWithIdentifier:@"NCB"];
UINavigationController* ncC =
[storyboard instantiateViewControllerWithIdentifier:@"NCC"];
self.ncArray = @[ncA,ncB,ncC];
这样做的好处是没有标签栏可以隐藏......
那么你的选择看起来像......
- (IBAction)openNav:(UIButton*)sender {
AppDelegate* appDelegate =
(AppDelegate*)[[UIApplication sharedApplication] delegate];
int idx = 0;
if ([sender.titleLabel.text isEqualToString: @"option 1"]) {
idx = 0;
}else if ([sender.titleLabel.text isEqualToString: @"option 2"]){
idx = 1;
}else if ([sender.titleLabel.text isEqualToString: @"option 3"]){
idx = 2;
}
[self presentViewController:appDelegate.ncArray[idx]
animated:YES completion:nil];
}