【问题标题】:How to do circular and complex navigations?如何进行循环和复杂的导航?
【发布时间】:2013-11-05 11:11:06
【问题描述】:

在我的程序中有 6 个视图控制器。(在故事板中) 让我们定义 1,2,3,4,5,6。

1 是我的主要观点。

我想像这样导航(下图)。有可能吗? 给我一个想法来做这个导航。

【问题讨论】:

  • 这是一个常规的导航方案。使用 UINavigationController。
  • 使用self.navigationController pushViewController、popViewController、popToViewController
  • 你好铍。感谢您及时的回复。你能解释一下所提到的吗?我们正在使用带有模式视图控制器的 Storyboard。但是有一个大问题,一段时间后它会占用大量内存并且应用程序会崩溃。因此,如上所述,我正在寻找处理复杂导航的最佳选择。如果您能提供样品,那就太好了。
  • @pubudu,你必须使用popViewController,popToRootViewController方法来避免将所有控制器收集到一个堆栈中。

标签: ios iphone uinavigationcontroller segue uistoryboardsegue


【解决方案1】:

是的,你可以实现这个。这是在 iOS 中使用 NavigationController 进行的简单导航。 你有六个 viewController 1、2、3、4、5、6。

要做到这一点: 首先创建一个 NavigationController 并使用 ViewController 1(即根 View Controller)对其进行初始化。

现在你的 navigationController 的行为就像一个包含你所有推送的视图控制器的堆栈。 NavigationController 只是推送和弹出您的视图控制器。

所以,每次你想要导航时,首先检查你的 viewController 是否在 navigationController 堆栈中。如果它已经在堆栈中,则弹出到该控制器,如果没有,则推送相同的视图控制器。 此用途如下:

如果是 ViewController3

-(void)popToSelectedViewController
{
    NSArray *vc=[self.navigationController viewControllers];

    ViewController3 *vc3=nil;

    for (int i=0; i<[vc count]; i++)
    {
        UIViewController *tempVC=[vc objectAtIndex:i];
        if([tempVC isKindOfClass:[ViewController3 class]])
        {
            vc=[vc objectAtIndex:i];
            break;
        }
    }

   if(vc3)
    {
       //If exists inside stack the pop
         [self.navigationController popToViewController:vc3 animated:YES];
    }
   else
   {
        //If not exists inside stack push ViewController3
        ViewController3 *vc3New= [[ViewController3 alloc]initWithNibName:@"ViewController3" bundle:nil];
        [self.navigationController pushViewController:vc3New animated:YES];
         [vc3New release];
   }


}

用 navigationController 初始化你的 ViewController1:

如果使用故事板 使用 UINavigationController 嵌入您的 initialViewController(即 viewController3)。 为此:

Step1:打开storyboard,选择你的initialViewController(即viewController3)。

Step2: 进入菜单中的编辑器 -> 选择嵌入 -> 选择 UINavigationController。 这将创建一个导航控制器并将 viewController3 初始化为 rootViewController。

如果不使用故事板 在.h中制作vc3(ViewController3)和applicationNavigationController(UINavigationController)的属性

在 .m 中:

在 appDelegate 中获得了方法“application... didFinishedLaunching ....” 并写:

self.vc3=[[ViewController3 alloc]initWithNibName:@"ViewController3" bundle:nil];
    self.applicationNavigationController=[[UINavigationController alloc] initWithRootViewController:self.vc3];
  self.window.rootViewController=self.applicationNavigationController;
[self.window makeKeyAndVisible];

【讨论】:

  • 你能给我举个例子吗?我有问题首先创建一个 NavigationController 并使用 ViewController 1 初始化它
  • 你使用故事板吗?
  • 非常感谢@Satish Azad,这对我来说非常有用。这意味着我不需要 prepareForSegue 和 [self performSegueWithIdentifier:@"linktoviewmeetingitem" sender:tableView];就像这样的导航。
  • 它不工作 Satish Azad。我将您的功能放在 VC1 中的按钮操作中(导航 VC2)。之后出现此错误stackoverflow.com/questions/19791724/… 请对此发表评论。
  • 你使用故事板吗?
【解决方案2】:

首先你创建一个导航控制器对象

UINavigationController *navCtrl = [[UINavigationController alloc]initWithRootViewController:rootViewController];
self.window.rootViewController = navCtrl;

如果你想去1->2,1->3,1->6等,为下一个viewcontroller创建一个对象并将其推送到导航堆栈

[self.navigationController pushViewController:second animated:YES];

你不需要做任何额外的工作就可以回到之前的视图控制器。默认的后退按钮可让您返回。

如果你需要返回根视图控制器,那么使用这个:

[self.navigationController popToRootViewControllerAnimated:YES]; 

如果你想返回到任何特定的视图控制器,那么使用这个

[self.navigationController popToViewController:viewController animated:YES];

【讨论】:

  • 我怎样才能移动到 3->5 ?
  • 只需从 3 创建一个 5 的对象并推送该对象。
【解决方案3】:

使用UINavigationController。它也不是圆形的。它可以被认为是堆叠的方法。这就是导航控制器的作用

A must read for you

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2020-09-23
    相关资源
    最近更新 更多