正如 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;
}
隐藏选项卡栏的另一种方法是在属性检查器中为每个(初始)viewController 选中“Hides bottom bar on push”框。您不必为后续的 viewController 执行此操作,只需在该选项卡项中看到的第一个。
然后,当您需要导航到其中一个 navController 组时……</p>
- (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
,您的应用设计可能会以其他方式导航...)
更新
如果您想在没有标签栏控制器的情况下执行此操作,则可以实例化一个包含指向每个导航控制器的指针的数组:
UINavigationController* ncA =
[storyboard instantiateViewControllerWithIdentifier:@"NCA"];
UINavigationController* ncB =
[storyboard instantiateViewControllerWithIdentifier:@"NCB"];
UINavigationController* ncC =
[storyboard instantiateViewControllerWithIdentifier:@"NCC"];
self.ncArray = @[ncA,ncB,ncC];
这样做的好处是没有要隐藏的标签栏……</p>
那么你的选择看起来像……</p>
- (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];
}