如何显示不同的视图控制器(每个具有其各自的导航控制器)使用故事板ID(how to display

2019-09-02 15:49发布

我的工作我的第一个应用程序。 这是我想要完成的任务:

会有几个不同选项的菜单。 为简单起见,假设这是由与IBAction为网点UIButtons和功能存在随时拉起菜单。

每个菜单按钮,按下时,应显示一个不同的导航控制器的内容。 如果用户带来了菜单,使不同的选择,他在其中当前操作应该不会受到影响导航控制器; 新选择的导航链显示在旧的表面上,并通过菜单,用户可以回到他离开的地方在以前的导航链随时视图。

直观的说明(点击更高分辨率):

请注意,有3种不同的导航控制器/链。 根视图控制器(这也是在该简化版本的菜单)不是它们的任意部分。 这将不足以实例导航链重新之一,当它先前已被实例化,这里的原因:如果用户从是在选项2的屏幕3,然后从菜单中选择选项1,然后选择选项2(再次)在菜单中,他应该寻找选项2的屏幕3 - 对他离开的地方; 视图控制器,当他离开以前的导航链应该被带回顶端,他观看。

我可以使一个按钮实例化,并从故事板呈现视图控制器如果没有导航控制器:

- (IBAction)buttonPressed:(id)sender {
    UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"View 2"];
    [self presentViewController:controller animated:YES completion:nil];
}

然而,我无法弄清楚如何使这两种方法所涉及导航控制器工作。 此外,我不知道这两种方法是正确的选择,因为我并不想总是实例化一个新的视图控制器:(?导航)时,按下菜单按钮时,应检查执行,以查看视图控制器使用相应的标识符已经被实例化。 如果是这样,它应该简单地进行顶视图控制器。

总之,这里是我的问题:

1)如何我应该实例和显示被嵌入在导航控制器的视图控制器,优选地使用一个故事板ID? 你使用导航控制器或视图控制器的故事板ID?

2)我应该如何检查一个实例是否已经存在? 同样,我应该检查的现存导航控制器或视图控制器,什么是这样做的最佳方法是什么?

3)如果所选择的导航链已经被实例化,并在视图控制器某处的堆叠,什么是它使顶端的最佳方法?

谢谢!!

侧面说明 - 这将是很好知道如何粘贴代码段缩进和颜色格式保存:)

Answer 1:

作为罗布建议,标签栏控制器将成为一个好组织原则为您的设计。

一个的UITabBarController添加到您的故事板,给它一个故事板的ID。 每个三套viewControllers(连同其各自navController)的分配给在tabBarController标签项目。

 UITabBarController
      |--> UINavigationController --> VC1  ---> VC2  -->
      |--> UINavigationController --> VC1  ---> VC2  -->
      |--> UINavigationController --> VC1  ---> VC2  -->

在您的应用程序委托作出强有力的属性来保存你的标签栏控制器的指针。 由于标签栏控制器保持指向它的所有选项卡项目,这将照顾国家为每个组viewControllers的。 您将不必另备指针的任何一个,你可以得到通过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;
}

隐藏标签栏的另一种方式是检查在属性检查器用于每个(初始)viewControllers的框中的“上推隐藏底栏”。 你不必为后续viewControllers,只是将在该选项卡项目可以看出,第一个做到这一点。

然后,当你需要导航到你的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 ,你的应用程序的设计可以用其它方式浏览这个...)

更新

如果你想做到这一点没有一个标签栏控制器,你可以实例化一个数组的指针保持到每个导航控制器,而不是:

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];
}


Answer 2:

1 /你可以在你的主要的viewController您viewDidLoad方法实例化一个的viewController,所以这将是实例只有1次。

现在如果你想显示你的控制器,你会更好地推动它:

- (IBAction)buttonPressed:(id)sender {
// Declare your controller in your .h file and do :
controller = [self.storyboard instantiateViewControllerWithIdentifier:@"View 2"];
// Note you can move this line in the viewDidLoad method to be called only 1 time

// Then do not use :
// [self presentViewController:controller animated:YES completion:nil];

// Better to use :
[self.navigationController pushViewController:controller animated:YES];
}

2 /我不知道 ,但如果你想检查是否一个实例已经存在只检查:

if (controller) {
    // Some stuff here
} // I think this checks if controller is initiated.

3 /我知道这不是一个很好的建议,但我会告诉你不用担心检查,如果你的控制器已经存在,因为我觉得它更容易再次使用2线接入到您的viewController:

controller = [self.storyboard instantiateViewControllerWithIdentifier:@"View 2"];
[self.navigationController pushViewController:controller animated:YES];

4 /我不知道,如果颜色都可以在这里使用,因为一个特定的样式表。

我不知道真的有好回答你的问题,但我希望这会帮助你。



文章来源: how to display various view controllers (each having its respective navigation controller) using storyboard ID