Search code examples
objective-ciosuitabbar

iOS code optimization


I'm new in iOS development and this may be a very basic question- in my app i've 5 VC with UITabBarController on each VC. I'm handling tab bar item click by-

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
    switch (item.tag)
    {
        case 0:
        {
            vc1 = [[VC1 alloc] initWithNibName:@"VC1" bundle:nil];
            [self.view addSubview:vc1.view];
            [tabbarObj setSelectedItem:[tabbarObj.items objectAtIndex:0]];
        }
            break;
        case 1:
        {
            vc2 = [[VC2 alloc] initWithNibName:@"VC2" bundle:nil];
            [self.view addSubview:vc2];
        }
            break;
        case 2:
        {
            vc3 = [[VC3 alloc] initWithNibName:@"VC3" bundle:nil];
            [self.view addSubview:vc3];
        }
            break;
        case 3:
        {
            [tabbarObj setSelectedItem:[tabbarObj.items objectAtIndex:3]];
        }
            break;
        case 4:
        {
            vc5 = [[VC5 alloc] initWithNibName:@"VC5" bundle:nil];
            [self.view addSubview:vc5];
        }
            break;
        default:
            break;
    }
}

and i know this is not a right way to handle tab bar because every time when i click on a tab bat item it will add a subView on current view. Can anybody suggest me a better way?Thanks.


Solution

  • in Your Appedelegate.m file Make changes in didFinishLaunchingWithOptions Method

     tabBar_Controller = [[UITabBarController alloc] init];
        NSMutableArray *localControllersArray =[[NSMutableArray alloc]initWithCapacity:2];
    
    
    
        firstViewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    
        nav = [[UINavigationController alloc] initWithRootViewController:firstViewController];
    nav.tabBarItem.title = @"item1";
        nav.navigationBar.barStyle = UIBarStyleBlack;
       [localControllersArray addObject:nav];
                [self setNav:nil];
    
        secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    
        nav = [[UINavigationController alloc] initWithRootViewController:secondViewController];
        nav.tabBarItem.title = @"item2";
               [localControllersArray addObject:nav];
    
        [self setNav:nil];
     tabBar_Controller.viewControllers = localControllersArray;
       tabBar_Controller.delegate = self;
        tabBar_Controller.selectedIndex = 0;
    [self.window addSubview:tabBar_Controller.view];
    

    To Access Some properties after Your ViewController is Selected Use the following Code.

    - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewControllers
    {
        NSUInteger index=[[tabBarController viewControllers] indexOfObject:viewControllers];
    
        switch (index) {
    
    
            case 0:
            {
    
                NSLog(@"selected 1");
    
                break;
            }
            case 1:
    
              {
                NSLog(@"selected 2");
                        break;
            }
            default:
                break;
        }
    
    
    }
    

    For Changing Background image of tabbar Controller you can use Following Code.

    - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewControllers{
        NSUInteger index=[[tabBarController viewControllers] indexOfObject:viewControllers];
    
        switch (index) {
            case 0:
                [tabBarController.tabBar setBackgroundImage:[UIImage imageNamed:@"tab_act21.png"]];
    
                break;
            case 1:
                [tabBarController.tabBar setBackgroundImage:[UIImage imageNamed:@"tab_act22.png"]];
                break;
            case 2:
                [tabBarController.tabBar setBackgroundImage:[UIImage imageNamed:@"tab_act23.png"]];
                break;
            default:
                break;
        }
    
        return YES;
    }