首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >popToViewController无动画

popToViewController无动画
EN

Stack Overflow用户
提问于 2012-09-19 02:59:59
回答 2查看 1.3K关注 0票数 2

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

我使用的是带有xcode 4.4的故事板。我有一个3视图控制器(好,5真的,但其他我认为是不相干的)。视图控制器A推送到视图控制器B。视图控制器B在其导航条上有一个分段控制,其导航条上有2个段,以及一个后向button.View contoller B负载,所选段1。当用户选择段0时,视图控制器C将被实例化。第一次推的时候一切都很好。你从A被推到B,然后当你按下它会弹出到A。我的问题是当我popToViewController到包含视图控制器A的数组列表时,它会弹出,但是它不会动!我知道你在想什么,“是的,笨蛋!”然而,动画是yes..HUH吗?这是我的密码:

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

代码语言:javascript
复制
-(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

代码语言:javascript
复制
-(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];
}
}

我知道当您实例化时,您将创建该视图控制器的一个新实例,以及创建一个新的导航堆栈(或类似的内容)。我想这可能和这事有关。不管怎么说,为什么它不动流行音乐呢?我希望在我当前的构建中实现一些东西,但是如果它需要重建,那么就这样吧!任何帮助都是非常感谢的。我已经做了我的家庭作业,但没有解决办法。

感谢所有提前!

编辑:我应该补充的是,初始弹出回到A从视图控制器B是动画。当您开始切换分段控件时,当您切换到查看控制器C时,返回到查看控制器A不会激活弹出。所以最初当你从A加载到B时,它会弹出成功的动画。但是在切换之后,它会弹回A,没有动画,动画方法是肯定的。

EN

回答 2

Stack Overflow用户

发布于 2012-09-19 04:00:15

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

代码语言:javascript
复制
// in vcC.m ...

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

看看类引用中流行音乐的不同品种。你可以弹回一个,或者弹出根,或者弹到你历史上的一个特定的VC。这样做的方法是读取viewControllers堆栈(而不是写它),找到要弹出的VC,然后使用popTo.方法,该方法在代码中。

但是听起来popToRoot是你所需要的。

票数 0
EN

Stack Overflow用户

发布于 2012-09-19 15:33:55

你对你的处境仍然有些困惑,但这里有另一个提示:你可以事先创造历史。假设您想从VC0推送到VC2,当弹出时,您希望从VC2弹出到VC1或VC0。完全可行的:

代码语言:javascript
复制
// 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];

选择弹出的地方..。

代码语言:javascript
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12487970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档