Iphone popToViewController未设置动画

Iphone popToViewController未设置动画,iphone,storyboard,uisegmentedcontrol,xcode4.4,poptoviewcontroller,Iphone,Storyboard,Uisegmentedcontrol,Xcode4.4,Poptoviewcontroller,伙计,我必须说,如果没有这个网站,我就没有头发了,我现在可能已经从桥上跳下来了。好啊我的问题是: 我正在使用xcode 4.4的故事板。 我有3个视图控制器(实际上是5个,但我认为其他的都不相关)。视图控制器A按下视图控制器B。视图控制器B的导航栏上有一个分段控件,有2个分段和一个后退按钮。视图控制器B在选定分段1的情况下加载。当用户选择段0时,视图控制器C将被实例化。第一次推的时候一切都很好。你从A被推到B,然后当你按下返回键时,它会弹出到A。我的问题是,当我将popToViewControl

伙计,我必须说,如果没有这个网站,我就没有头发了,我现在可能已经从桥上跳下来了。好啊我的问题是:

我正在使用xcode 4.4的故事板。 我有3个视图控制器(实际上是5个,但我认为其他的都不相关)。视图控制器A按下视图控制器B。视图控制器B的导航栏上有一个分段控件,有2个分段和一个后退按钮。视图控制器B在选定分段1的情况下加载。当用户选择段0时,视图控制器C将被实例化。第一次推的时候一切都很好。你从A被推到B,然后当你按下返回键时,它会弹出到A。我的问题是,当我将popToViewController弹出到包含视图控制器A的数组列表时,它会弹出,但它不会动画!我知道你在想什么,“动画:是的,傻瓜!”然而,动画就是…嗯?这是我的密码:

下面是视图控制器B中发生的事情

这里是视图控制器C

-(iAction)上一个:(id)发送方
{
NSInteger指数=-1;
ReportAppDelegate*appDelegate=
(ReportAppDelegate*)[[UIApplication sharedApplication]委托];
MainOrangeTestViewController*orangeViewController=[appDelegate orangeViewController];
orangeViewController=[self.storyboard实例化eViewController标识符:@“Orange”];
NSArray*newVCarray=[[NSArray alloc]initWithObjects:orangeViewController,nil];
self.navigationController.viewControllers=newVCarray;

对于(int i=0;i您是否只是尝试按A->B->C,然后再次弹出到A,跳过B?如果是,则无需修改导航控制器的ViewController属性

// in vcC.m ...

-(IBAction)Previous:(id)sender
{
    [self.navigationController popToRootViewControllerAnimated:YES];
}
查看中的不同类型的pop。您可以返回一个,或弹出到根目录,或弹出到历史记录中的特定VC。方法是读取viewControllers堆栈(而不是写入),找到要弹出到的VC,然后使用代码中的popTo…方法


但听起来PoptRoot是您需要的。

您只是想按A->B->C,然后再次弹出到A,跳过B吗?如果是这样,则无需修改导航控制器的ViewController属性

// in vcC.m ...

-(IBAction)Previous:(id)sender
{
    [self.navigationController popToRootViewControllerAnimated:YES];
}
查看中的不同类型的pop。您可以返回一个,或弹出到根目录,或弹出到历史记录中的特定VC。方法是读取viewControllers堆栈(而不是写入),找到要弹出到的VC,然后使用代码中的popTo…方法


但听起来PoptRoot是您需要的。

对于您的情况仍然有点困惑,但这里有另一个提示:您可以事先创建历史。假设您想从VC0推到VC2,当弹出时,您想从VC2弹出到VC1或VC0。完全可行:

// in VC0.m, animated push to VC2
// push to vc1 invisibly
[self.navigationController pushViewController:vc1 animated:NO];
// we've made history!  now push visibly to vc2
[self.navigationController pushViewController:vc2 animated:YES];
要选择返回的位置

// in VC2.m
if (/* user needs a regular pop back to VC1 */) {
    [self.navigationController popViewControllerAnimated:YES];
} else // pop back two, to VC0
    NSArray *viewControllers = [self.navigationController viewControllers];

    // we're not assuming that vc0 is the root here, the top of the navigation stack
    // is at index=count-1.  self is at the top.  a regular pop is just below == count-2.
    // two pops is at count-3, and so on.
    NSInteger backBackIndex = viewControllers.count - 3;

    // in case we get here by some other pushing path, worst case pop is to the root
    backBackIndex = MAX(backBackIndex, 0);

    UIViewController *backBackVC = [viewControllers objectAtIndex:backBackIndex];
    [self.navigationController popToViewController:backBackVC animated:YES];
}

对您的情况仍然有点困惑,但这里有另一个提示:您可以事先创建历史记录。假设您想从VC0推送到VC2,当弹出时,您想从VC2弹出到VC1或VC0。完全可行:

// in VC0.m, animated push to VC2
// push to vc1 invisibly
[self.navigationController pushViewController:vc1 animated:NO];
// we've made history!  now push visibly to vc2
[self.navigationController pushViewController:vc2 animated:YES];
要选择返回的位置

// in VC2.m
if (/* user needs a regular pop back to VC1 */) {
    [self.navigationController popViewControllerAnimated:YES];
} else // pop back two, to VC0
    NSArray *viewControllers = [self.navigationController viewControllers];

    // we're not assuming that vc0 is the root here, the top of the navigation stack
    // is at index=count-1.  self is at the top.  a regular pop is just below == count-2.
    // two pops is at count-3, and so on.
    NSInteger backBackIndex = viewControllers.count - 3;

    // in case we get here by some other pushing path, worst case pop is to the root
    backBackIndex = MAX(backBackIndex, 0);

    UIViewController *backBackVC = [viewControllers objectAtIndex:backBackIndex];
    [self.navigationController popToViewController:backBackVC animated:YES];
}

很抱歉,我应该解释得更清楚一点。我把视图a断章取义。实际上有一个根视图控制器推到视图控制器a。因此,PoptRoot弹出到根视图D:我也尝试弹出到一个特定的视图控制器。但是,当我切换分段控件时,我正在实例化一个新的视图控制器每次都是如上所述。这不是意味着我实际上重新创建了视图控制器堆栈或丢失了堆栈顺序吗?我这么说是因为如果你切换段并按下视图控制器B,它会弹出视图控制器AI对不起。我的意思是当你切换段时(在B和C之间切换)当你在B上按下后退按钮时,它会弹出你查看控制器C。然而,如果你只是从A上按下B,然后在B上按下后退按钮,它会弹出你返回A!…我有点异想天开。所以我的意思是,一旦视图控制器被实例化,历史不会被删除吗?所以我正在尝试实现一个成功的弹出从B和C段到A。我正在成功地执行此操作,但是由于某些原因,返回A的弹出没有动画。我将尝试创建一个自定义推送序列,从视图B中的段控件到视图C。我将查看是否无法执行类似“如果分段控件位于索引0上(因为它从1开始),然后推送到视图C”的操作然后以某种方式将两个视图都弹出到A。也许这样我就可以避免实例化,并在导航堆栈中保留一些历史记录…这是愚蠢的吗?抱歉,我对这一点太陌生了。LOL效果很差。显然分段控件似乎只喜欢valueChanged事件。我相信我的总体问题是视图C没有连接到情节提要(因此,所有的实例化)。如果我能用某种方式将它连接到故事板的其他部分,这样我就可以拥有导航堆栈历史!我相信实例化在这里把我搞砸了。@danh-你完全了解了一些事情,非常感谢你。读而不是写!我需要想办法简单地将视图c添加到历史中,而不是创建新的历史!有id吗eas太好了!:我很抱歉,我应该解释得更清楚一点。我在上下文之外获取了视图a。实际上有一个根视图控制器推送到视图控制器a。因此,PoptRoot弹出到根视图D:我也尝试弹出到特定的视图控制器。但是,当我切换分段控件时,我正在实例化每次都会按照上面的方法创建一个新的视图控制器。这不是意味着我实际上重新创建了视图控制器堆栈,或者丢失了堆栈顺序吗?我这么说是因为如果你切换段并按下视图控制器B,它会弹出视图控制器AI对不起。我的意思是当你切换段时(这是B和C之间的一个开关)当您在B上时按下后退按钮,它会弹出您查看控制器C。而如果您只是按下