在视图控制器之间保留自定义标签栏视图状态

Preserve custom tabbar view state between view controllers

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

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

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

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

正确的方法是像往常一样只使用 prepareForSegue 并不断更新视图状态或传递视图实例吗?或者有更好的方法吗?

我认为最好的方法是实现与原生标签栏类似的东西。您可以通过实施 container view 来实现这一点。如何做到这一点对 post 来说是一个很长的故事,但是互联网上有很多资源。基本上你会有相同的假栏,你的视图控制器将显示在容器视图中,容器视图应该放在选项卡栏的正上方。具有容器视图和选项卡栏的视图控制器应该管理转换并更新栏。

是的,正如 Jelly 所说我会走 parent/child 视图控制器路线,'tab bar' 管理 adding/removing 视图控制器和相关视图以响应触摸事件。

我正在处理相同的场景。在 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];
} 

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

[self.navigationController.view addSubview:view];