popToViewController不是动画

问题描述:

男人我必须说如果不是这个网站,我会没有头发,我现在可能会跳下一座桥。好!我的问题:popToViewController不是动画

我正在使用xcode 4.4的storyboard。 我有一个3视图控制器(好吧5真的,但其他我认为是无关紧要的)。视图控制器A推动查看控制器B.视图控制器B在其导航栏上有一个分段控件,带有2个分段和一个后退按钮。视图控制器B加载了选定的分段1。当用户选择段0时,视图控制器C被实例化。第一次推进时一切顺利。你从A被推到B,然后当你按回它时弹出到A.我的问题是当我popToViewController到包含视图控制器A的数组列表时,它弹出,但它没有动画!我知道你在想什么,“Animate:是假!”然而,动画是的是啊..啊?这里是我的代码:

继承人什么在视图控制器B布莱恩

-(IBAction)Previous:(id)sender{ 
[self.navigationController popViewControllerAnimated:YES]; 
} 

- (IBAction)segmentSwitch:(id)sender; 
{ 
if ([sender selectedSegmentIndex] == 0) 
{ 
    MapViewController *controller = [self.storyboard   instantiateViewControllerWithIdentifier:@"Map"]; 
    [self.navigationController pushViewController:controller animated:NO]; 
} 
else if ([sender selectedSegmentIndex] == 1) { 
    ListViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"List"]; 
    [self.navigationController pushViewController:controller animated:NO]; 

} 
} 

继承人视图控制器C

-(IBAction)Previous:(id)sender 
{ 
NSInteger index = -1; 

ReportAppDelegate *appDelegate = 
(ReportAppDelegate *)[[UIApplication sharedApplication]delegate]; 
MainOrangeTestViewController *orangeViewController = [appDelegate orangeViewController]; 

orangeViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Orange"]; 
NSArray* newVCarray = [[NSArray alloc] initWithObjects:orangeViewController, nil]; 
self.navigationController.viewControllers = newVCarray; 

for(int i=0 ; i<[newVCarray count] ; i++) 
{ 

    if([[newVCarray objectAtIndex:i] isKindOfClass:NSClassFromString(@"MainOrangeTestViewController")]) 
    { 
     index = i; 
    } 
} 
[self.navigationController popToViewController:[newVCarray objectAtIndex:index] animated:YES]; 



} 
- (IBAction)segmentSwitch2:(id)sender; { 
if ([sender selectedSegmentIndex] == 0) 
{ 
    MapViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"Map"]; 
    [self.navigationController pushViewController:controller animated:NO]; 
} 
else if ([sender selectedSegmentIndex] == 1) 
{ 
    ListViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"List"]; 
    [self.navigationController pushViewController:controller animated:NO]; 
} 
} 

我知道当你实例化所创建的新实例该视图控制器以及创建一个新的导航堆栈(或类似的东西)。我在想这可能与它有关。无论如何,为什么地球上不是动画流行?我希望能够在我当前的版本中实现一些东西,但是如果它需要重建,那就这样吧!任何帮助是极大的赞赏。我已经完成了我的作业,但没有解决方案。

感谢所有提前!

编辑:我应该补充说,从视图控制器B回到A的初始POP是动画。 HOwever当您​​开始切换分段控件时,并且当您切换到查看控制器C时,返回到视图控制器A不会为流行音乐设置动画。所以最初当你从A加载到B时,它会弹出成功的动画。但是在切换之后,它会弹出回到没有动画的A,并且动画方法为YES。

+0

停止跳,我相信你会找到答案〜:) – Winnie

+0

停止跳?哦,请详细说明:) – mafiOSo

+0

你说你会跳下一座桥 – Winnie

你只是想推A-> B-> C,然后再次跳回到A,跳过B?如果是这样,则不需要修改导航控制器的viewControllers属性。

// in vcC.m ... 

-(IBAction)Previous:(id)sender 
{ 
    [self.navigationController popToRootViewControllerAnimated:YES]; 
} 

查看class reference中流行的不同品种。您可以弹出一个,或弹出到根目录,或弹出到您历史记录中的特定VC。做到这一点的方法是阅读 viewControllers堆栈(不写),找到你想要弹出的VC,然后使用你的代码中的popTo ...方法。

但它听起来像popToRoot是你需要的。

+0

我很抱歉,我应该更好一点解释一下。我忽略了A的观点。实际上有一个根视图控制器,它推动查看控制器A.所以说,popToRoot弹出到根目录D:我也尝试弹出到特定的视图控制器。但是,当我切换分段控件时,我每次都按照上面的方式实例化一个新的视图控制器。这并不意味着我实际上重新创建视图控制器堆栈或丢失堆栈顺序或什么?我这样说,因为如果你切换段,并按下视图控制器B,它会弹出您查看控制器A – mafiOSo

+0

对不起。我的意思是当你切换段(这是B和C之间的切换)并且当你在B时按下后退按钮时,它会弹出来查看控制器C.而如果你刚刚从A按下B,然后按下后退当你在B时,它会让你回到A! ....我已经交叉眼睛了。所以我得到的是,一旦视图控制器被实例化,是不是历史被抹去? – mafiOSo

+0

所以我试图从B和C部分完成A的成功流行。我正在成功地做到这一点,但出于某种原因弹回到A并不是动画。我将尝试从视图B中的段控件创建一个自定义push segue来查看C.我会看看我是否不能像“如果分段控件位于索引0(因为它从1开始)然后推动查看C“,然后让两个视图以某种方式弹出到A.也许然后我可以避免实例化并在nav stack中保留一些历史记录......这是否愚蠢?对不起,我对此很新颖。 – mafiOSo

对你的情况还是有点困惑,但这里有另外一个提示:你可以预先创建历史。假设您想从VC0推送到VC​​2,并且在弹出时,您想要从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]; 
} 
+0

你在戏弄我!大声笑...我相信我的解决方案是在“[self.navigationController pushViewController:vc1 animated:NO]之前的行;”我这样说是因为如果我正确完成了作业(在开发人员的文档和这个令人惊叹的站点之间),在故事板上初始化一个VC对象的最好方法是实例化它。那么问题就在于此。如果我实例化,我没有历史记录。你试着从实例化的VC中弹出,xcode对你大声说:你试图弹出一个不存在的vc。在我的场景中,实例化已被证明是邪恶的。D: – mafiOSo

+0

它可能是一个术语问题,“实例化”就是你要求一个班级为你提供一个实例。这分配了对象。你必须实例化一个视图控制器使其存在。然后初始化它,然后通过告诉容器视图控制器(如导航控制器)来推送它,然后呈现它。 – danh

+0

好吧,我拿回来。实例化DOES创建历史,但它是新的历史。历史不再涉及VC 0,仅仅是VC 1和2.因此,当你从VC 2中弹出时,它会将你带到VC 1,当我试图完成的是从VC 1和VC 2弹出到VC 0 (这是我的细分市场)。我通过实例化完成了这个任务,但是即使动画方法设置为YES,它也不会动画弹出转换。我需要一个initWithNibName D的故事板版本:我不想被强迫所有的东西在我的项目中有很多风险投资家都会帮助T_T – mafiOSo