Objective c UINavigationController:在堆栈中的位置复制控制器

Objective c UINavigationController:在堆栈中的位置复制控制器,objective-c,ios,cocoa-touch,uinavigationcontroller,Objective C,Ios,Cocoa Touch,Uinavigationcontroller,我有一个UINavigationController,它将一些视图推送到堆栈上。当我进入几级后,我需要调用一个模态视图,它是UINavigationController的副本,与调用导航控制器处于同一级 这可能吗?如果tableView当前不可见,则不应直接与之交互。(即,当另一个ViewController位于堆栈顶部时) 对于您在注释中描述的问题,更好的解决方案是修改数据源,并在显示tableView时立即重新加载它。是的,这是可能的 要以模式推送新的导航堆栈,请创建新的导航控制器,并用所需

我有一个
UINavigationController
,它将一些视图推送到堆栈上。当我进入几级后,我需要调用一个
模态视图
,它是
UINavigationController
的副本,与调用导航控制器处于同一级


这可能吗?

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

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

是的,这是可能的

要以模式推送新的导航堆栈,请创建新的导航控制器,并用所需的视图填充其堆栈(
setViewControllers:
)。您可以在这个新堆栈中使用相同的VC实例,但我建议改为使用新实例(可能是相同类的实例)。只要新的模态堆栈就位,旧堆栈就会被隐藏。解除导航控制,取回你的旧堆栈

如果您只想替换当前堆栈中的VC,可以弹出当前VC(可能没有动画!),然后推送新VC。用户将能够使用导航栏中的左按钮在现有堆栈中导航,并在实现它时向前导航


调用
UINavigationController:setViewControllers
用一个调用替换navcon的整个堆栈。此转换可以设置动画,也可以不设置动画。

最好在每个视图的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

请允许我用一小段代码来总结答案:

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

我不这么认为。如果您详细说明您正在努力实现的目标,我们可能会建议另一种解决方案。我想从导航控制器中的TableView中移动行。当我调用新模式时,我处于“移动模式”。这就是我希望一个新控制器在堆栈中具有相同位置的地方,这样我可以选择一个位置来移动这些行。我认为您只有一个UINavigationController,对吗?或者您正在创建两个单独的navcon堆栈?navcon堆栈中的视图应该只是UIViewController子类。但是,当我呈现一个模式视图时,我正在添加一个新的navigationController。如果调用
presentViewController
,则新视图不在navigation controller堆栈中;“同一级别”的概念不适用。这听起来像是想要现有的X堆栈级别,再加上第二组X堆栈级别,这看起来很不寻常——尤其是在中间输入第二个堆栈。你能澄清一下你想要实现什么吗?是的,我想要第二个导航堆栈。看看Apple Mail应用程序,看看当你想移动电子邮件时它们会做什么。它显示具有新堆栈的模态。这就是我想做的事情。为了回应你的澄清,我对这个答案做了一些修改。好的,但是我如何复制整个堆栈的对象呢?
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];