保留视图控制器之间的自定义选项卡视图状态

时间:2016-03-30 19:46:27

标签: ios uiview uiviewcontroller segue uiviewanimationtransition

我们有一个自定义视图,它看起来像一个tabbar但最终是UIView的子类。

视图显示为UIViewController底部的标签栏。在视图控制器中触摸图像时,我们转换到另一个视图控制器。

第二个视图控制器底部显示相同的假标签栏视图。用户可以关闭第二个视图控制器,它将转换回第一个视图。

为两个视图控制器保持相同视图及其状态的最佳方法是什么?例如,伪标签栏的一部分可能是可用按钮,其徽章图标显示(2)。如果触及它,将归结为(1)。这需要反映在视图的两个实例上。

正确的方法是正常使用prepareForSegue并继续更新视图状态或传递视图实例吗?或者有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

我认为最好的方法是使用本机标签栏实现类似的功能。您可以通过实施container view来实现这一目标。你如何做到这一点是一个很长的故事发布在这里,但互联网上有很多资源。基本上你会有相同的假条,你的视图控制器将显示在容器视图中,应该放在标签栏的正上方。包含容器视图和选项卡栏的视图控制器应管理转换并更新栏。

答案 1 :(得分:1)

是的,正如Jelly所说,我已经使用'标签栏'管理添加/删除视图控制器和相关视图以响应触摸事件。

答案 2 :(得分:1)

我在同一场景上工作。在UIViewController中,在底部和上方的tabBar视图中取一个空白的UIView。现在单击tabBar按钮,使用AutoLayout添加和删除新的ViewController视图,如 -

#pragma mark - TAB BAR METHODS

-(void)setSelecedView:(VIEWSELECTION)selecedView
{
    [self RemoveChildViewControllers ];
    switch (selecedView)
    {
        case VIEWSELECTION_HOME:
        {
            HomeViewController *homeVC = [[HomeViewController alloc]initWithNibName:@"HomeViewController" bundle:nil];
            self.titleString=@"Wellborn Company App";
            [self displayContentController:homeVC OnView:self.DumpingView];
        }
            break;
        case VIEWSELECTION_SEARCH:
        {
            SearchViewController *searchVC = [[SearchViewController alloc]initWithNibName:@"SearchViewController" bundle:nil];
            self.titleString=@"Search";
            [self displayContentController:searchVC  OnView:self.DumpingView];
        }
            break;
}}

#pragma mark - VC Adding/Removing Methods

- (void)RemoveChildViewControllers
{
    NSArray *childVCArray = [self childViewControllers];

    for ( __strong UIViewController *childvc in childVCArray)
    {
        [childvc willMoveToParentViewController:nil];
        [childvc.view removeFromSuperview];
        [childvc removeFromParentViewController];
    }
}

- (void)displayContentController:(UIViewController*) content OnView:(UIView*)parentView
{
    [self addChildViewController:content];
    [parentView addSubview:content.view];

    NSDictionary *views = @{
                            @"childView" : content.view,

                            };
    NSArray *arr;

    [content.view setTranslatesAutoresizingMaskIntoConstraints:NO];

    arr = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[childView]-0-|" options:0 metrics:nil views:views];
    [parentView addConstraints:arr];

    arr = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[childView]-0-|" options:0 metrics:nil views:views];
    [parentView addConstraints:arr];    
    [content didMoveToParentViewController:self];
} 

答案 3 :(得分:1)

如果它只是一个视图而您只是在导航堆栈上推送视图控制器,那么将您的视图添加到导航视图控制器视图。

[self.navigationController.view addSubview:view];