自定义的UITabBarController UINavigationController的和(Cu

2019-07-21 00:44发布

我开发的iOS5及以上的应用程序,我不使用故事板或IB。 我创建一个自定义UITabBarController ,在我AppDelegate我在里面我把4个视图控制器只有1 UINavigationController (不知道为什么)。

这导致了行为,其中我只能从第一个选项卡,这显然是,打包成一个推新VC UINavigationController称为navController

SGTabBarController *tabBarController = [[SGTabBarController alloc] init];

    SGHomeViewController* vc1 = [[SGHomeViewController alloc] init];
    SGChooseOSAgainViewController* vc3 = [[SGChooseOSAgainViewController alloc] init];
    SGSmsServicesViewController* vc4 = [[SGSmsServicesViewController alloc] init];
    SGSupportViewController *vc5 = [[SGSupportViewController alloc] init];
    navController = [[UINavigationController alloc] initWithRootViewController:vc1];

    NSArray* controllers = [NSArray arrayWithObjects:navController, vc3, vc4, vc5, nil];
    tabBarController.viewControllers = controllers;

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = tabBarController;
    [navController setNavigationBarHidden:YES animated:NO];
    [self.window makeKeyAndVisible];

这是为什么? 我应该创建一个单独UINavigationController为每个标签? 我把这个代码从Apple的文档。

Answer 1:

是的你可以。 尝试这样的事情代码yourUITabBarController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
        
    NSMutableArray* sectionViewControllers = nil;
    NSArray* controllers = [self controllers];
    UIViewController* controller = nil;
    
    for (controller in controllers)
    {
        if (sectionViewControllers == nil)
            sectionViewControllers = [NSMutableArray arrayWithCapacity:0];
        
        UINavigationController* navigationController = [[UINavigationController allocWithZone:[self zone]] initWithRootViewController:controller];
        
        navigationController.navigationBarHidden = YES;
        
        [sectionViewControllers addObject:navigationController];
        [navigationController release];
    }
    
    self.viewControllers = sectionViewControllers;
}

- (NSArray*)controllers
{
    if (!_controllers)
        _controllers = [NSArray arrayWithObjects:[self tabController1], [self tabController2], nil];
    return _controllers;
}

这在你AppDelegate.m:

self.window.rootViewController = self.yourUITabBarController;


Answer 2:

我是否应为每片单独的UINavigationController

如果你想在每个选项卡浏览, 你应该添加嵌入navigationController各的viewController。



Answer 3:

假设你有一个tabbarController。 现在,你可以在你的tabController添加任何的viewController或任何NavController。 NavController可以包含的viewController。 但是你会困惑,你会用navController或的viewController。 您将使用的viewController,你不需要导航,我的意思是,你并不需要。

下面是一个代码示例,其中第一视图仅包含视图和第二视图包含导航控制器。 你不能在第一个视图推新观点,但你可以很容易地在第二视图推新视图。

-(void)addTabBarControllers
{
    UIViewController *viewController1, *viewController2;

    viewController1 = [[[HomeView alloc] initWithNibName:@"HomeView" bundle:nil] autorelease];
    viewController2 = [[[FloorPlanHome alloc] initWithNibName:@"FloorPlanHome" bundle:nil] autorelease];


    UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:viewController2];

    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, nav2, nil];

    [[self.tabBarController.tabBar.items objectAtIndex:0] setTitle:@"First View"];
    [[self.tabBarController.tabBar.items objectAtIndex:1] setTitle:@"Second View"];


    [[self.tabBarController.tabBar.items objectAtIndex:0] setImage:[UIImage imageNamed:@"first.png"]];
    [[self.tabBarController.tabBar.items objectAtIndex:1] setImage:[UIImage imageNamed:@"second.png"]];

    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
}

呼叫从AppDelegate中didFinishLaunchingWithOptions此方法。 这里HomeView和FloorPlanView是两种不同的意见,您首先需要添加这些意见和类文件。



Answer 4:

请参考这里我的答案:
问题的UITabBarController

if(!self.tabBarController)
    self.tabBarController = [[UITabBarController alloc] init];

self.tabBarController.delegate=self;

NSMutableArray *localcontrollerarray = [[NSMutableArray alloc] initWithCapacity:2];

UIViewController *viewController1 = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];

UINavigationController *navi1 = [[UINavigationController alloc] initWithRootViewController:viewController1];

[localcontrollerarray addObject:navi1];

UIViewController *viewController2 = [[ScanViewController alloc] initWithNibName:@"ScanViewController" bundle:nil];

UINavigationController *navi2 = [[UINavigationController alloc] initWithRootViewController:viewController2];

[localcontrollerarray addObject:navi2];

self.tabBarController.viewControllers = localcontrollerarray;

[self.window addSubview:self.tabBarController.view];


文章来源: Custom UITabBarController and UINavigationController