无法将标签栏应用程序添加到 popToRootViewController

Posted

技术标签:

【中文标题】无法将标签栏应用程序添加到 popToRootViewController【英文标题】:Can't get tabbar app to popToRootViewController 【发布时间】:2012-12-08 18:20:18 【问题描述】:

我有一个带有导航栏和横幅视图委托的程序化标签栏委托。对于我的生活,我似乎无法让标签在点击时弹出根视图。我知道我需要使用类似 [self.navigationController popToRootViewControllerAnimated:NO];但我不知道将它放在我的应用程序委托中的哪个位置。

@implementation AppDelegate 
UITabBarController *_tabBarController;
  


 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:      (NSDictionary *)launchOptions

NSError *setCategoryError = nil;

CGRect bounds = [[UIScreen mainScreen] bounds];
self.window = [[UIWindow alloc] initWithFrame:bounds];
self.window.backgroundColor = [UIColor whiteColor];

NSMutableArray * viewControllers = [[NSMutableArray alloc] init];

NSString * subscriptionListFile = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Subscription.plist"];

NSDictionary * subscriptionList = [[NSDictionary alloc] initWithContentsOfFile:subscriptionListFile];

NSArray * subscriptionFolders = subscriptionList[@"Folders"];

NewsListViewController * newsController = nil;
UINavigationController * newsNavigationController = nil;
BannerViewController * bannervcs = nil;

for (NSDictionary * folderDetails in subscriptionFolders) 

    NSArray * newsItems = folderDetails[@"Items"];
    NSString * folderTitle = folderDetails[@"FolderName"];
    NSString * folderIcon = folderDetails[@"FolderIcon"];
    UIImage * folderIconImage = [UIImage imageNamed:folderIcon];

    newsController = [[NewsListViewController alloc] initWithNewsSourceList:newsItems];
    [newsController setTitle:folderTitle];

    newsNavigationController = [[UINavigationController alloc] initWithRootViewController:newsController];
    [newsNavigationController setTitle:folderTitle];

    bannervcs = [[BannerViewController alloc] initWithContentViewController:newsNavigationController];
    [bannervcs.tabBarItem setImage:folderIconImage];
    [viewControllers addObject:bannervcs];

  


_tabBarController = [[UITabBarController alloc] init];
_tabBarController.viewControllers = viewControllers;

   self.window.rootViewController = _tabBarController;
   [self.window makeKeyAndVisible];

    return YES;




 @end

知道我在哪里添加 popToRootViewController 吗?我最后试过了,但它似乎没有抓住任何控制器......

【问题讨论】:

您在 tabBarController 的哪个位置添加导航控制器? 我的设置是一个TabBarController,带有Container BannerViewController,带有Nav,带有TableView。导航是在 VC 被包装在横幅之前添加的,所以如果你 NSLOG viewController 它返回 BannerViewController(1-4),我需要一种方法来获取所选容器控制器内的导航栏到 poptoroot。我下面的代码只能看到 BannerView,而不是子导航视图。 什么是 NewsListViewController ?? Newslist 是表格视图,newsnav 是导航,bannervcs 是横幅容器,tabbar 是标签栏。 newsnav 无法访问,因为它包含在横幅 vc 中。 【参考方案1】:

您需要设置一些东西作为您的 UITabBarControllerDelegate。假设您想在您的 AppDelegate 上尝试此操作,请将以下行添加到您的方法中:

_tabBarConroller.delegate = self;

然后,将此方法添加到您的 AppDelegate(因为它现在也被视为 UITabBarControllerDelegate)

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

    viewController.navigationController popToRootViewControllerAnimated:NO];

这是假设,无论用户在哪个状态下将导航堆栈留在选项卡上,点击另一个选项卡始终会将用户带到导航堆栈的根视图控制器。

【讨论】:

是的,没有进入顶层。我应该能够单击选项卡项目,它应该转到该 vc 的根视图,但它没有......bannerview delagate(ios 5.0 vc 容器)或 tabbar 代表搞砸了? 就在弹出 nslog 说 viewController 是 BannerViewController 并且 viewController.navigationController 为 null 之前。我必须将流行音乐放在 for tabitem 循环中吗?或以某种方式从bannerview更改delagate? 尝试在 BannerViewController 上调用 popToRootViewController。 那也没用,我不知道如何访问代理导航栏。我认为以下是我想要的,但我不知道如何使它工作...... MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication].delegate; UINavigationController *navController = [appDelegate.tabBarController.viewControllers objectAtIndex:indexOfNavController]; [navController popToRootViewController:NO]; 我不知道,Ima noob 并在苦苦挣扎:/ 这是 nslog,找不到导航并弹出它,或者如何通过我的 appdelagate 逐步深入了解:/ ViewController = BannerViewController: tabBarController = UITabBarController: tabBarControllerViewController = ( "BannerViewController: 0x867f450", "BannerViewController: 0x83c58d0", "BannerViewController: 0x83c7b40", "BannerViewController: 0x83c9c90") navController = (null)【参考方案2】:

如果你想在你的 tabBar 中添加导航控制器,那么你必须添加你的导航控制器而不是视图控制器。 因此,在您的情况下,您没有将 navigationControllers 添加到 tabBarControllers 数组中。

[viewControllers addObject:bannervcs]; 

所以不要添加bannervcs 添加newsNavigationController

[viewControllers addObject:newsNavigationController];  

欲了解更多信息,请阅读并获取来自UITabBarController Class Reference的示例代码

【讨论】:

Soo.... 将表格包裹在横幅中并将横幅/表格包裹在导航中?将导航放在横幅的顶部?而不是在横幅内? 先告诉我你的问题的流程......什么是NewsListViewController?什么是 BannerViewController? 问题是我的标签栏没有像标签栏应用程序那样在点击时弹出到根导航。我有一个表格视图(newscontroller),包裹在导航(newsnavcontroller)中,包裹在 iAd 套件容器控制器(bannervcs)中,包裹在标签栏中。问题是,iAd 必须包装导航/表格以将广告保持在顶部。所以标签栏看到的是横幅容器,而不是导航容器......如果我将表格包裹在横幅而不是导航中,则广告不会停留在顶部。 好吧,暂时忘记导航...我想要的只是让该死的标签栏在每次点击标签栏时重新加载 VC。如果 VC 阵列充满了 Banner VC 容器,我该怎么做? 你在哪里使用 [self.navigationControllr pushviewController:...]

以上是关于无法将标签栏应用程序添加到 popToRootViewController的主要内容,如果未能解决你的问题,请参考以下文章

即使选项卡按钮无法立即访问该屏幕,也将选项卡栏添加到所有屏幕

将标签栏项目添加到 UITabBar 时出现问题

将 UINavigationController 添加到标签栏应用程序

将标签栏添加到导航控制器

如何在用户操作后添加标签栏

如何将“更多”按钮添加到标签栏?