UINavigationController里面的UITabBarController里面的UITableViewController

时间:2013-12-26 13:52:37

标签: ios objective-c uitableview uinavigationcontroller uitabbarcontroller

我的问题

我在UINavigationController中使用UITabBarController。 UITabBarController中有三个tableviews。如图所示,第一个表视图正确显示,而其他两个tableviews部分隐藏在导航栏后面。我该如何解决这个问题?

enter image description here enter image description here enter image description here

我的层次结构:

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

这是我的代码:

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

2 个答案:

答案 0 :(得分:5)

通常,层次结构是

UITabBarController
    - UINavigationController
        - UITableViewController

为什么要尝试将导航控制器放在首位?尝试使用充满导航控制器的标签栏重新组织。

答案 1 :(得分:1)

我昨天遇到了同样的问题,并决定解决它。它只是一个阻碍的方法,所以这里是重写:

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

注意:那里有一个魔术变量 - 20 - 用于通话状态栏,它与周围的导航有完全不同的关系...

对此有任何帮助将不胜感激,但确实有效。