从 UINavigationController 中弹出一个包含 UITabBarController 的 UIViewController

Posted

技术标签:

【中文标题】从 UINavigationController 中弹出一个包含 UITabBarController 的 UIViewController【英文标题】:Pop a UIViewController containing a UITabBarController off of a UINavigationController 【发布时间】:2011-07-20 20:18:58 【问题描述】:

我有一个 UINavigationController(a) 将 UIViewController(b) 推送到堆栈上。 (b) 包含一个 UITabBarController(c)。 (c) 有 5 个选项卡,并且这些 ViewControllers(d,e,f,g,h) 中的任何一个都需要能够从堆栈中弹出 (b)。

我试过 [[self.parentViewController navigationController] popViewControllerAnimated:YES];在许多其他事情中,这些似乎都不起作用。有什么想法吗?

编辑:

.h 文件:

@interface MATabViewController : UIViewController<UITabBarControllerDelegate> 
UIViewController *ref;


@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UIImageView *imgViewFooter;

@end

.m:

#import "MATabViewController.h"

@implementation MATabViewController
@synthesize tabBarController = _tabBarController;
@synthesize imgViewFooter;

- (void)viewDidLoad

[super viewDidLoad];

self.view = self.tabBarController.view;

self.tabBarController.delegate = self;
self.imgViewFooter.frame = CGRectMake(0.0f, 395.0f, 320.0f, 64.0f);
[self.tabBarController.view addSubview:self.imgViewFooter];
self.tabBarController.selectedIndex = 0;

ref = [[self.tabBarController viewControllers] objectAtIndex:0];


-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 

NSInteger index = [[tabBarController viewControllers] indexOfObject:viewController];

switch (index) 
    case 0:
        self.imgViewFooter.image=[UIImage imageNamed:@"footer_full.png"];
        break;
    case 1:
        self.imgViewFooter.image=[UIImage imageNamed:@"footer_full.png"];
        break;
    case 2:
        self.imgViewFooter.image=[UIImage imageNamed:@"footer_full.png"];
        break;
    case 3:
        self.imgViewFooter.image=[UIImage imageNamed:@"footer_full.png"];
        break;
    case 4:
        self.imgViewFooter.image=[UIImage imageNamed:@"footer_full.png"];
        break;

    default:
        break;

return YES;


-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
if (ref != viewController) 
    [ref viewDidDisappear:YES];
    ref = viewController;
    [viewController viewDidAppear:YES];



@end

请注意我在这一行中的主要技巧:

self.view = self.tabBarController.view;

【问题讨论】:

您的意思是要从 (d-h) 跳回 (a) 吗?如果是这样,[self.navigationController popToRootViewControllerAnimated:YES] 应该可以解决问题,因为所有视图都应该继承与根堆栈中相同的导航控制器 是的,这不起作用,不幸的是......我刚刚尝试过。我认为 (b) 需要调用它,但我似乎无法让它... 这只是一个猜测,但[[[[self.tabBarController parentViewController] navigationController] popViewControllerAnimated:YES] 可能是更直接的路线。它几乎告诉(d-h)视图控制器调用它们的父 tabBarController,然后调用它的父级,然后是导航控制器 感谢回复,但还是不行……:( 你想要达到的不是好的应用设计。谁调用popViewController?我猜在每个视图控制器的标签栏视图中都有一个后退按钮,对吧?假设用户一直在切换标签——他可能认为后退按钮会引导他进入之前选择的标签,你不同意吗?即使你找到了让它工作的方法,我建议你找到另一种方法来组织你的界面。 【参考方案1】:

我遇到了类似的问题(如果我收到问题)。您可以将您的UIViewController (b) 声明为UITabBarController 的子类吗?请注意UITabBarControllerUIViewController 的子类,因此您可以继续使用它作为普通UIViewController。这样,您将在单个控制器中拥有 (b) 和 (c)。 现在[self.navigationController popViewController]; 应该可以工作了。 至少,我是这样解决的。

【讨论】:

这似乎是最好的解决方案,您能否详细说明如何完成此操作?我将使用 UIViewController(b) 中的代码更新我的问题 在.h中简单的声明你的MATabViewController为UITabBarController的子类(协议没问题,不用改),去掉*tabBarController的@property声明。在.m remove 中删除@synthesize 语句,并在viewDidLoad 中,将self.tabBarController 替换为简单的self(这是因为self 是一个tabBarController)。没试过,但应该可以。 似乎[self.navigationController popViewControllerAnimated:true]; 是现在的方法(ios 5.1)。或[self.navigationController popToRootViewControllerAnimated:true];,取决于你想走多远。

以上是关于从 UINavigationController 中弹出一个包含 UITabBarController 的 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

从 UINavigationController 切换到 UISplitviewController

从UINavigationController中控制UINavigationItem内容

从 UINavigationController 设置 UITabBarItem 标题?

如何从 UINavigationController 隐藏 UINavigationBar?

UINavigationController 内的 UIPageController 从顶部偏移?

从 UiviewController 切换到 UiNavigationController