UINavigationController:位置堆栈中的重复控制器

问题描述:

我有一个UINavigationController,它将几个视图压入堆栈。一旦我有几个级别,我需要调用一个modal view,这是UINavigationController的一个副本,与调用导航控制器处于同一级别。UINavigationController:位置堆栈中的重复控制器

这可能吗?

+0

我不这么认为。如果您详细描述您正在努力完成的任务,我们可能会提出另一种解决方案。 – fscheidl 2012-02-21 20:09:36

+0

我想从我的导航控制器中的TableView中移动行。当我调用新的模式时,我处于“移动模式”。这是我想要一个新控制器在堆栈中找到相同位置的位置,所以我可以选择一个位置来移动这些行。 – 2012-02-21 21:00:55

+0

我认为你只有一个UINavigationController,对吧?或者你是否创建了两个独立的navcon堆栈? navcon栈中的视图应该只是UIViewController的子类。 – AndrewS 2012-02-21 22:48:04

如果当前不可见,则不应直接与tableView交互。 (即,当另一个ViewController位于堆栈顶部时)

对于在注释中描述的问题,最好的解决方案是修改数据源并在显示后立即重新载入tableView。

是的,这是可能的。

要以模态方式推入新导航堆栈,请创建一个新的导航控制器并使用所需视图填充其堆栈(setViewControllers:)。你可能在这个新堆栈中使用相同的VC实例,但我建议,而不是新的实例(可能是相同的类)。只要这个新的模式堆栈就位,旧的堆栈将被隐藏。关闭NavCon以恢复旧堆栈。

如果您只想替换当前堆栈中的VC,可以弹出当前的VC(可能不是动画!),然后推送新的VC。用户将能够使用导航栏中的左侧按钮浏览现有的堆栈,并按照您的实施方式向前导航。

调用UINavigationController:setViewControllers用一次调用代替navcon的整个堆栈。这种转换可以是动画或不是您自己决定。

+0

但是,当我呈现模式视图时,我添加了一个新的导航控制器。 – 2012-02-22 00:25:37

+0

如果您调用'presentViewController',您的新视图不在导航控制器堆栈上; “同等水平”的概念不适用。这听起来像你想要现有的X堆栈层次,再加上第二组X堆栈层次,这看起来很不寻常 - 特别是进入中间的第二个堆栈。你能澄清你想达到的目标吗? – AndrewS 2012-02-22 15:56:34

+0

是的,我想要第二个导航堆栈。查看Apple Mail应用程序,并查看他们在移动电子邮件时的操作。它显示了一个新的堆栈模式。这是我想要做的事情。 – 2012-02-22 20:10:36

Bettr在每个视图中leftnavigationitem添加一个按钮和popto RootView写动作以除去堆

[self.navigationController popToRootViewControllerAnimated:YES]; 

在viewDidLoad中添加返回按钮

//To set the back buttin on Navigation bar 
    UIBarButtonItem *backButton = [[[UIBarButtonItem alloc] initWithTitle:@"<--" style:UIBarButtonItemStyleBordered target:self action:@selector(backclick:)] autorelease]; 
    self.navigationItem.leftBarButtonItem = backButton 

现在implwment动作

- (IBAction)backclick:(id)sender 
{ 
    // To goback to the main view 
    [self.navigationController popToRootViewControllerAnimated:YES]; 

} 

请同意我用一小段代码片段总结答案:

UIViewController *previousVC = nil; 
if ([self.navigationController.viewControllers count] > 1) 
    previousVC = 
     [self.navigationController.viewControllers objectAtIndex: 
     ([self.navigationController.viewControllers count] -2)]; 
else 
    previousVC = [self.navigationController.viewControllers objectAtIndex:0];