Iphone 使用自定义顺序转换时,TabBar会丢失。如何取回它?

Iphone 使用自定义顺序转换时,TabBar会丢失。如何取回它?,iphone,ios5,storyboard,uitabbar,Iphone,Ios5,Storyboard,Uitabbar,所以我决定尝试使用故事板构建一个iPhone应用程序。 我很快就建立了一个基本的基于标签的应用程序 TabBar控制器作为初始视图控制器,具有两个选项卡。 在每个选项卡上,附加一些视图作为内容 在一个选项卡上,我有一个导航控制器,它下面几乎没有其他视图。 在这里我没有问题。我可以使用自定义按钮和导航栏来回移动。 此外,在视图中的所有移动过程中,选项卡栏始终处于其位置 然后我拿到了第二张账单。 这里没有导航控制器, 因为,在第二个选项卡上,我需要使用自定义序列在视图之间创建自定义过渡动画。到目前为

所以我决定尝试使用故事板构建一个iPhone应用程序。 我很快就建立了一个基本的基于标签的应用程序

TabBar控制器作为初始视图控制器,具有两个选项卡。 在每个选项卡上,附加一些视图作为内容

在一个选项卡上,我有一个导航控制器,它下面几乎没有其他视图。 在这里我没有问题。我可以使用自定义按钮和导航栏来回移动。 此外,在视图中的所有移动过程中,选项卡栏始终处于其位置

然后我拿到了第二张账单。 这里没有导航控制器, 因为,在第二个选项卡上,我需要使用自定义序列在视图之间创建自定义过渡动画。到目前为止,序列、动画和过渡都没有问题(至少我几乎得到了我需要的动画:)。 但我被卡住的地方是那个塔巴。 只要我按下任何使用自定义顺序导航到另一个视图的按钮,我就会丢失我的选项卡栏。即使我导航回初始视图,也不再有选项卡栏

我读过一些关于在视图堆栈中弹出tabbar控制器的文章,但是我能找到的所有示例都不适合我

如果有人遇到类似问题,请分享解决方案。任何指向一些好的教程或样本都将不胜感激

编辑: 因此,我的自定义顺序如下所示:

我的“(无效)执行”看起来像这样: (至少它按预期从源到目标进行动画制作。唯一错误的是,TabBar被隐藏或取消)

#导入“xcustomsequee.h”
#进口
@XCustomSequence的实现
@合成appDelegate=\u appDelegate;
-(无效)履行{
UIViewController*srcViewController=(UIViewController*)self.sourceViewController;
UIViewController*destViewController=(UIViewController*)self.destinationViewController;
self.appDelegate=[[UIApplication sharedApplication]delegate];
CATTransition*trans=[CATTransition动画];
[trans-setType:KCATransionMoveIn];
[trans-setFillMode:kCAFillModeBoth];
[传输设置持续时间:1];
[传输设置子类型:KCATransistionfromLeft];
CALayer*layer=destViewController.view.layer;
[srcViewController.view removeFromSuperview];
[self.appDelegate.window addSubview:destViewController.view];
[层添加动画:trans-forKey:nil];
self.appDelegate.window.rootViewController=destViewController;
}
@结束

在第二个选项卡中,您还需要使用导航控制器,但“显示导航栏”处于禁用状态。您的故事板如下所示

        +-> [NavC-1] --> [VC-1-1] --(push)-> [VC-1-2] ...
        |   (shows nav bar)
[TabC] -+
        |
        +-> [NavC-2] --> [VC-2-1] --(custom)-> [VC-2-2]
            (hides nav bar)
- (IBAction)goBack:(id)sender
{
    [UIView transitionWithView:self.navigationController.view duration:0.2
                       options:UIViewAnimationOptionTransitionFlipFromRight
                    animations:^{
                        [self.navigationController popViewControllerAnimated:NO];
                    }
                    completion:NULL];
}
当您从VC-2-1导航到VC-2-2时,使用自定义segue(UIStoryboardSegue的子类),并使用-perform方法,如下所示。 (见附件)

当您从VC-2-2导航回VC-2-1时,您不想使用segue,因为它会创建VC-2-1的新副本。相反,您可以使用如下所示的操作方法(当按下后退按钮时调用)

        +-> [NavC-1] --> [VC-1-1] --(push)-> [VC-1-2] ...
        |   (shows nav bar)
[TabC] -+
        |
        +-> [NavC-2] --> [VC-2-1] --(custom)-> [VC-2-2]
            (hides nav bar)
- (IBAction)goBack:(id)sender
{
    [UIView transitionWithView:self.navigationController.view duration:0.2
                       options:UIViewAnimationOptionTransitionFlipFromRight
                    animations:^{
                        [self.navigationController popViewControllerAnimated:NO];
                    }
                    completion:NULL];
}

所以,在互联网上乱搞了各种各样的样本后,尽管仍然没有一个像预期的那样起作用,我还是放弃了我的自定义seque动画,以备以后的黑客攻击。决定坚持Hoshi的建议。至少我的标签栏总是可见的,而且动画代码更少

因此,通过故事板,我得出了以下结论(与Hoshi的建议有点不同):

我使用标准的推序列进行前向幻灯片转换(这里没有编写代码,所有内容都在故事板上)

然后在第二个分支上,我需要一个没有导航栏的视图,并带有自定义的后退按钮,当按下该按钮时,将开始向后滑动过渡。当然,选项卡栏必须保持在原来的位置。 导航栏很容易隐藏,只需取消选中[NavC-2]属性面板中的“显示导航栏”。 现在,为了获得向后幻灯片转换,我为第二个分支中的每个视图控制器创建了自定义类,并用以下内容填充它们:

#import "VC_2_1.h"   
@implementation VC_2_1

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

@end
在[VC-2-1]上的“后退”按钮调用的是按下的“后退”按钮。 [VC-2-2]和第二个分支中的任何其他VC也是如此

所有这些人都给了我所需要的。 按自定义按钮并使用左右滑动动画在视图之间导航。tabbar不会迷路的。:)

事实上,问题的关键在于这一行,正如Hoshi所建议的那样

[self.navigationController popViewControllerAnimated:YES];
当按下自定义按钮(而不是标准导航栏上的“后退”按钮)时,这是为我提供后退幻灯片动画的唯一方法


干杯

在第二个选项卡中,我认为您使用的是“模态”segue(而不是seque)。这意味着您正在现有视图层次结构(包括选项卡栏)上打开一个模式全屏视图,当您“向后导航”(我认为您已经创建了另一个模式序列)时,您将打开另一个模式全屏视图。“向后导航”的正确方法是调用[self-dismissModalViewControllerAnimated:YES]。否,它不是第二个选项卡中的“模态”序列。使用Modal时,无法将自定义序列与自定义动画一起使用。好的,我尝试了各种不同的序列类型。1) 按2)模式3)自定义|唯一不隐藏选项卡栏的是数字1-按。这个序列的缺点是不可能(我没有找到任何方法)在这里为过渡应用任何自定义动画。所以推是不可能的。嗨,Hoshi,我知道如何制作基本的定制序列,但我还是试了你的。因此,当使用“(void)perform”代码时,我的视图只是从源代码切换到源代码。(比如*src和*dst是相同的视图)。我用我的序列代码示例更新了我的初始帖子。也许这意味着第二个选项卡中没有UINavigationController。。。我也看过你的样品。“self.appDelegate.window.rootViewController=destViewController;”表示用destViewController替换整个屏幕(包括选项卡栏控制器和选项卡中的所有vc,而不是当前选项卡中的一个vc)。
[self.navigationController popViewControllerAnimated:YES];