2

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

我正在使用带有 xcode 4.4 的情节提要。我有 3 个视图控制器(确实有 5 个,但我认为其他的无关紧要)。视图控制器 A 推送到视图控制器 B。视图控制器 B 在其导航栏上有一个分段控件,带有 2 个分段和一个后退按钮。视图控制器 B 加载时选择了分段 1。当用户选择段 0 时,视图控制器 C 被实例化。在第一次推动时一切都很好。你从 A 被推到 B,然后当你按下它时它会弹出到 A。我的问题是当我 popToViewController 到包含视图控制器 A 的数组列表时,它会弹出,但它没有动画!我知道你在想什么,“Animate:YES dummy!” 然而,动画是是的……嗯?这是我的代码:

这是视图控制器 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 是动画的。但是,当您开始切换分段控件并且切换到视图控制器 C 时,返回视图控制器 A 不会为弹出设置动画。因此,最初当您从 A 加载到 B 时,它会以成功的动画弹回。但是在切换之后它会弹回到没有动画的 A 并且动画方法是 YES。

4

2 回答 2

0

对您的情况仍然有些困惑,但这里有另一个提示:您可以事先创建历史。假设您想要从 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];
}
于 2012-09-19T15:33:55.660 回答
0

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

// in vcC.m ...

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

在类参考中查看不同种类的流行音乐。您可以弹回一个,或弹出到根目录,或弹出到您历史记录中的特定 VC。这样做的方法是读取viewControllers 堆栈(而不是写入它),找到要弹出的 VC,然后使用代码中的 popTo... 方法。

但听起来 popToRoot 是你需要的。

于 2012-09-19T04:00:15.297 回答