Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 以编程方式在选项卡栏项之间导航_Iphone_Objective C_Ios_Ipad_Uitabbarcontroller - Fatal编程技术网

Iphone 以编程方式在选项卡栏项之间导航

Iphone 以编程方式在选项卡栏项之间导航,iphone,objective-c,ios,ipad,uitabbarcontroller,Iphone,Objective C,Ios,Ipad,Uitabbarcontroller,我有一个包含5个选项卡的选项卡栏控制器,每个选项卡栏项目都有单独的导航控制器,如: 现在,如果我当前在选项卡3中的导航Ctrller3的viewctrller3中,并且我希望以编程方式导航到选项卡1中的导航Ctrller1的viewctrller2。此外,我还以编程方式选择了特定的选项卡1,但我无法访问的viewctrller2 导航Ctrller1。这是否可行?如果可行,请详细说明。。 请大家携起手来 我认为这不会有任何问题。假设您的nav1是第一个navigationController

我有一个包含5个选项卡的选项卡栏控制器,每个选项卡栏项目都有单独的导航控制器,如:

现在,如果我当前在选项卡3中的导航Ctrller3viewctrller3中,并且我希望以编程方式导航到选项卡1中的导航Ctrller1viewctrller2。此外,我还以编程方式选择了特定的选项卡1,但我无法访问的viewctrller2 导航Ctrller1。这是否可行?如果可行,请详细说明。。
请大家携起手来

我认为这不会有任何问题。假设您的nav1是第一个navigationController

[self.nav1 pushViewController:view2 animated:YES];

它必须为您工作。

从ViewController3执行

   UINavigationController *navigationController1 =       [appDelegate.tabBarController.viewControllers objectAtIndex:2]; // fetch the navigationController

            [navigationController1 popToViewController:[navigationController1.viewControllers objectAtIndex:1] animated:NO];

            [appDelegate .tabBarController setSelectedIndex:0];

如果您当前在viewctrller3中,我认为您应该能够做到这一点:

    UITabBarController *tabCont = (UITabBarController *)[self.navigationController parentViewController];
    [tabCont setSelectedIndex:0];
    UINavigationController *nav1 = tabCont.selectedViewController;
    NSarray *newControllers = [NSArray arrayWithObjects:[nav1.viewControllers objectAtIndex:2],[nav1.viewControllers objectAtIndex:0],[nav1.viewControllers objectAtIndex:1], nil];
    [nav1 setViewcontrollers:newControllers animated:NO];

最后一行应该重新排列导航控制器的ViewController,以便viewctrller2现在是顶视图控制器。

实现这一点的一种方法是

[self.nav1 pushViewController:view2 animated:YES];
  • 在设置选项卡栏的SelectedIndex之前,请在appDelegate中维护一个引用变量,并为其指定选项卡选择后需要导航的类的名称
  • 在tabbar控制器的委托中:
    • (void)tabBarController:(UITabBarController*)tabBarController didSelectViewController:(UIViewController*)viewController
      检查visible controller的类是否与appdelegate引用变量中设置的类名相同?如果是,则无需执行任何操作,如果不是,则检查该控制器是否在导航堆栈中?如果它在堆栈中,则弹出/推送到该索引控制器,否则创建该控制器并推送到它

  • 我不确定我是否理解您的问题--您说您可以选择选项卡1,因此selectedViewController将为您提供导航控制器1,其[viewControllers objectAtIndex:1]将为您提供查看控制器2。是的,我的意思是我可以通过编程方式选择选项卡项。但是,如何直接从我的当前屏幕推送到NavigationController1的viewcontroller2您可能有一些操作方法可以从用户操作转到该屏幕。。现在,要以编程方式执行此操作,只需调用这些操作方法。。它会直接把你带到屏幕上。你看到我编辑的答案了吗?这对你有用吗?但它是动态的。我如何确保每次它都在第一导航控制器的第一个viewcontroller上?但我不会有ViewCtrler1和ViewCtrler2对象引用。@itechnician,请参阅我编辑过的答案。我认为这应该是可行的,如果导航控制器在它的导航堆栈上有你的帖子中显示的所有3个视图控制器。。只需转换UINavigationController*nav1=(UINavigationController*)tabCont.selectedViewController;您窗口的根控制器是什么?通过设置tabbarcontroller的selectedIndex,此deltegate不被调用,除非用户点击选项卡栏,否则不会调用它,然后您需要创建一个委托方法,并在以编程方式设置tab bar IndexB时调用它,但委托也是bruteforce类型的解决方案,我必须在第一个导航控制器的每个viewcontroller中检查它