2011-09-06 17 views
6

Quiero hacer un controlador de barra de pestañas y un controlador de navegación mediante programación. Mi código funciona hasta el momento y muestra una barra de pestañas en la parte inferior, pero OptionViewController no dice nada (sin título) en el botón de la segunda barra de pestañas. Lo curioso es que cuando hago clic en el botón sin nada, aparece el título (y también su vista). ¿Puede alguien explicarme qué estoy haciendo mal? He intentado utilizar el siguiente código:Agregar un controlador TabBar programmatically

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  
    // Override point for customization after application launch. 
    [self.window makeKeyAndVisible]; 

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

    DefaultViewController *dvc = [[DefaultViewController alloc] init]; 
    UINavigationController *dvc_nc = [[UINavigationController alloc] initWithRootViewController:dvc]; 
    [tabItems addObject:dvc_nc]; 
    [dvc release]; 
    [dvc_nc release]; 

    OptionsViewController *ovc = [[OptionsViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    UINavigationController *ovc_nc = [[UINavigationController alloc] initWithRootViewController:ovc]; 
    [tabItems addObject:ovc_nc]; 
    [ovc release]; 
    [ovc_nc release]; 

    UITabBarController *tbc = [[UITabBarController alloc] init]; 
    tbc.viewControllers = tabItems; 
    self.tabController = tbc; 
    [tabItems release]; 
    [tbc release]; 

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

    return YES; 
} 
+0

Creo que es necesario agregar UINavigationController como una vista en sub el controlador de Barra de pestañas con la superclase de clases de control como UINavigationController –

+0

el problema es solo el título que falta, ¿verdad? ¿Dónde estás configurando el 'título' de tu' OptionsViewConbtroller'? Si está configurando el título no en su método 'init', entonces el TabBarController solo lee un título vacío de su OptionsVC. Supongo que estás estableciendo la propiedad del título en sth. como 'viewDidLoad'? – thomas

+0

Supongo que no, porque esto: [tbc.view addSubview: ovc_nc.view]; hace que la pantalla esté completamente vacía! – Mark

Respuesta

10

Es necesario configurar el tabBarItem y título de la UINavigationController y no su viewController raíz.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  
    // Override point for customization after application launch. 
    [self.window makeKeyAndVisible]; 

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

    DefaultViewController *dvc = [[DefaultViewController alloc] init]; 
    UINavigationController *dvc_nc = [[UINavigationController alloc] initWithRootViewController:dvc]; 
    dvc_nc.tabBarItem.title = @"Default"; 
    dvc_nc.tabBarItem.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Default" ofType:@"png"]]; 
    [tabItems addObject:dvc_nc]; 
    [dvc release]; 
    [dvc_nc release]; 

    OptionsViewController *ovc = [[OptionsViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    UINavigationController *ovc_nc = [[UINavigationController alloc] initWithRootViewController:ovc]; 
    ovc_nc.tabBarItem.title = @"Option" 
    ovc_nc.tabBarItem.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Optiomn" ofType:@"png"]]; 

    [tabItems addObject:ovc_nc]; 
    [ovc release]; 
    [ovc_nc release]; 

    UITabBarController *tbc = [[UITabBarController alloc] init]; 
    tbc.viewControllers = tabItems; 
    self.tabController = tbc; 
    [tabItems release]; 
    [tbc release]; 

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

    return YES; 
} 
+0

¿Tiene algún código donde muestra exactamente lo que quiere decir? – Mark

+0

He actualizado mi publicación, le mostrará cómo configurar el tabBarItem. – rckoenes

+0

Ahora muestra el título correctamente, pero ahora cuando configuro el título en la vista de opciones en "Opciones" y con su método, lo inicio en "Opción", de modo que cuando la aplicación se inicia veo "Predeterminado" y "Opción". Cuando hago clic en el elemento TabBar, cambia el título a lo que configuré en viewDidLoad con self.title! – Mark

0

Si alguien necesita una versión de SWIFT. Esto funcionó para mí. Gracias @rckoenes por la respuesta objC que utilicé para traducir esto.

window?.makeKeyAndVisible() 

    let dvc = HomeViewController() 
    let dvc_nc = UINavigationController(rootViewController: dvc) 
     dvc_nc.tabBarItem.title = "Home" 
     dvc_nc.tabBarItem.image = UIImage(named: "HomeIcon") 
    controllers.append(dvc_nc) 

    let ovc = ProfileViewController() 
    let ovc_nc = UINavigationController(rootViewController: ovc) 
     ovc_nc.tabBarItem.title = "Profile" 
     ovc_nc.tabBarItem.image = UIImage(named: "ProfileIcon") 
    controllers.append(ovc_nc) 

    let tbc = UITabBarController() 
     tbc.viewControllers = controllers 

    window?.rootViewController = tbc 

    UINavigationBar.appearance().tintColor = UIColor(red: 0.05, green: 0.47, blue: 0.91, alpha: 1.0) 
    UINavigationBar.appearance().barTintColor = UIColor(red: 0.05, green: 0.47, blue: 0.91, alpha: 1.0) 
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()] 
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent 
3

creé el UITabbarController como rooview controlador de la aplicación con UINavigationController para UIViewController.

aquí un ejemplo más: Utilicé xibs para View Controllers.

AppDelegate.m

puedo crear un nombre de método: setupAppHome

#pragma mark - SETUP HOME 
-(void) setupAppHome{ 
    NSLog(@"set up the nano home"); 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    if (_chatViewController == nil) { 
     _chatViewController = [[ChatViewController alloc] initWithNibName:@"ChatViewController" bundle:nil]; 
     chatNav = [[UINavigationController alloc] initWithRootViewController:_chatViewController]; 
     [email protected]"Chat"; 
     chatNav.tabBarItem.image=[UIImage imageNamed:@"chat_icon.png"]; 

    } 
    if (_callController == nil) { 
     _callController = [[CallViewController alloc] initWithNibName:@"CallViewController" bundle:nil]; 
     callNav = [[UINavigationController alloc] initWithRootViewController:_callController]; 
     [email protected]"Call"; 
     callNav.tabBarItem.image=[UIImage imageNamed:@"call_icon.png"]; 

    } 
    if (_contanctsController == nil) { 
     _contanctsController = [[ContactsViewController alloc] initWithNibName:@"ContactsViewController" bundle:nil]; 
     conNav = [[UINavigationController alloc] initWithRootViewController:_contanctsController]; 
     [email protected]"Contact"; 
     conNav.tabBarItem.image=[UIImage imageNamed:@"contact_icon.png"]; 

    } 
    if (_settingController == nil) { 
     _settingController = [[SettingViewController alloc] initWithNibName:@"SettingViewController" bundle:nil]; 
     settingNav = [[UINavigationController alloc] initWithRootViewController:_settingController]; 
     [email protected]"Setting"; 
     settingNav.tabBarItem.image=[UIImage imageNamed:@"setting_icon.png"]; 

    } 

    self.tabController = [[UITabBarController alloc] init]; 

    NSMutableArray   *controllers = [[NSMutableArray alloc] initWithCapacity:4]; 
    [controllers addObject:chatNav]; 
    [controllers addObject:callNav]; 
    [controllers addObject:conNav]; 
    [controllers addObject:settingNav]; 


    self.tabController.viewControllers = controllers;//@[chatNav,callNav,conNav,settingNav]; 

    self.tabController.selectedIndex=0; 



    [self.window setRootViewController:self.tabController]; 
    [self.window makeKeyAndVisible]; 


} 

Se envió un mensaje en Xcode 9 con IOS 11.

Cuestiones relacionadas