在视图控制器之间保留自定义标签栏视图状态
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];
我们有一个自定义视图,它看起来像一个标签栏,但最终是 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];