que containerview container ios objective-c uitableview uinavigationcontroller uitabbarcontroller

ios - containerview - view controller que es



UITableViewController dentro de UITabBarController dentro de UINavigationController (2)

Mi problema

Estoy usando un UITabBarController dentro de un UINavigationController. Y hay tres vistas de tabla dentro del UITabBarController. Como se muestra en la imagen, la primera vista de tabla se muestra correctamente, mientras que las otras dos vistas de tabla se ocultan parcialmente detrás de la barra de navegación. ¿Cómo puedo arreglar esto?

Mi jerarquía:

  • Root: UINavigationController
    • UITabBarController
      • UITableViewController (table1, table2, table3)

Aquí está mi código:

AppDelegate.m

#import "AppDelegate.h" #import "TableViewController.h" @interface AppDelegate() @property UINavigationController* nav; @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. TableViewController* table1 = [[TableViewController alloc]init]; TableViewController* table2 = [[TableViewController alloc]init]; TableViewController* table3 = [[TableViewController alloc]init]; table1.title = @"table1"; table2.title = @"table2"; table3.title = @"table3"; UITabBarController* t = [[UITabBarController alloc] init]; [t setViewControllers:@[table1,table2,table3]]; self.nav = [[UINavigationController alloc] initWithRootViewController:t]; [self.window setRootViewController:self.nav]; [self.window makeKeyAndVisible]; return YES; } - (void)applicationWillResignActive:(UIApplication *)application{} - (void)applicationDidEnterBackground:(UIApplication *)application{} - (void)applicationWillEnterForeground:(UIApplication *)application{} - (void)applicationDidBecomeActive:(UIApplication *)application{} - (void)applicationWillTerminate:(UIApplication *)application{} @end

TableViewController.m

#import "TableViewController.h" @implementation TableViewController - (id)initWithStyle:(UITableViewStyle)style{ self = [super initWithStyle:style]; if (self) {} return self; } - (void)viewDidLoad{ [super viewDidLoad]; [self.tabBarController.view layoutSubviews]; } - (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 10; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell* c = [[UITableViewCell alloc] init]; [c.textLabel setText:[NSString stringWithFormat:@"%d", indexPath.row]]; return c; } @end


Por lo general, la jerarquía es

UITabBarController - UINavigationController - UITableViewController

¿Por qué intentas poner el Controlador de navegación en la parte superior? Intente reorganizar utilizando una barra de pestañas llena de controladores de navegación.


Ayer me tocó este mismo problema y decidí evitarlo. Es solo una clase que se interpone en el camino, así que aquí está la reescritura:

DRTabBarController.h

// // Created by Dan Rosenstark on 2/28/15. // Copyright (c) 2015 Confusion Studios LLC. All rights reserved. // #import <UIKit/UIKit.h> @interface DRTabBarController : UIViewController <UITabBarDelegate>; @property (nonatomic, strong) NSArray *viewControllers; @property (nonatomic, strong) UITabBar *tabBar; @property (nonatomic, strong) UIView *mainView; @end

DRTabBarController.m

// // Created by dr2050 on 2/28/15. // Copyright (c) 2015 Confusion Studios LLC. All rights reserved. // #import "DRTabBarController.h" @implementation DRTabBarController { } - (instancetype)init { self = [super init]; if (self) { self.tabBar = [[UITabBar alloc] init]; self.tabBar.delegate = self; self.tabBar.tintColor = [UIColor whiteColor]; self.tabBar.barStyle = UIBarStyleBlack; self.tabBar.backgroundColor = [UIColor blackColor]; self.mainView = [[UIView alloc] init]; } return self; } - (void)viewDidLoad { [self.view addSubview:self.tabBar]; [self.view addSubview:self.mainView]; } - (void)setViewControllers:(NSArray *)viewControllers { _viewControllers = viewControllers; NSMutableArray *tabBarItems = [NSMutableArray array]; for (UIViewController *controller in viewControllers) { UITabBarItem *item = controller.tabBarItem; [tabBarItems addObject:item]; } self.tabBar.items = tabBarItems; } - (void)viewWillAppear:(BOOL)animated { [self.tabBar setSelectedItem:self.tabBar.items.firstObject]; [self tabBar:self.tabBar didSelectItem:self.tabBar.items.firstObject]; } - (void)viewDidAppear:(BOOL)animated { } -(void)viewDidLayoutSubviews { CGRect frame = self.view.bounds; UITabBarController *throwaway = [[UITabBarController alloc] init]; frame.size.height = throwaway.tabBar.frame.size.height; frame.origin.y = self.view.bounds.size.height - frame.size.height; self.tabBar.frame = frame; self.tabBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; frame = self.view.bounds; frame.size.height -= self.tabBar.frame.size.height; float navbarHeight = self.navigationController.navigationBar.frame.size.height; // cannot use UIApplication.sharedApplication.statusBarFrame.size.height because // reports are not right with in-call status bar float statusBarHeight = UIApplication.sharedApplication.statusBarHidden ? 0 : 20; float topBarHeight = navbarHeight + statusBarHeight; frame.origin.y += topBarHeight; frame.size.height -= topBarHeight; self.mainView.frame = frame; self.mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; } - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { int index = [self.tabBar.items indexOfObject:item]; NSArray *subviews = self.mainView.subviews; for (UIView *view in subviews) { [view removeFromSuperview]; } UIView *view = [[self.viewControllers objectAtIndex:index] view]; view.frame = self.mainView.bounds; view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.mainView addSubview:view]; } @end

Nota: Hay una variable mágica allí - 20 - para la barra de estado durante la llamada, que tiene una relación totalmente diferente con el navegador que lo rodea ...

Cualquier ayuda con esto sería apreciada, pero funciona.