2011-09-06 2 views
6

Je souhaite créer un contrôleur de barre d'onglets et de navigation par programmation. Mon code fonctionne si loin qu'il affiche une barre d'onglets en bas, mais le OptionViewController ne dit rien (pas de titre) sur le bouton de la deuxième barre d'onglets. La chose amusante est, quand je clique sur le bouton sans rien dessus, le titre apparaît (et ainsi est son point de vue), quelqu'un peut-il m'expliquer ce que je fais mal? J'ai essayé d'utiliser le code suivant:Ajout d'un TabBarController par programme

- (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

Je pense que vous devez ajouter UINavigationController en vue de sous dans le contrôleur de la barre d'onglets avec les classes de contrôle super classe comme UINavigationController –

+0

le problème est seulement le titre manquant, non? où définissez-vous le 'title' de votre' OptionsViewConbtroller'? Si vous ne définissez pas le titre dans votre méthode 'init', TabBarController ne lit qu'un titre vide de votre OptionsVC. Je suppose que vous définissez la propriété title dans sth. comme 'viewDidLoad'? – thomas

+0

Je suppose que non, parce que ceci: [tbc.view addSubview: ovc_nc.view]; rend l'écran complètement vide! – Mark

Répondre

10

Vous devez définir le tabBarItem et le titre du UINavigationController et non son viewController racine.

- (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

Avez-vous du code pour montrer exactement ce que vous voulez dire? – Mark

+0

J'ai mis à jour mon post, il va vous montrer comment configurer tabBarItem. – rckoenes

+0

Maintenant, il montre le titre correctement, mais maintenant quand je définis le titre dans les options sur "Options" et avec votre méthode je l'initie sur "Option", donc quand l'application démarre, je vois "Default" et "Option". Lorsque je clique sur l'élément TabBar, il change le titre de ce que j'ai configuré dans viewDidLoad avec self.title! – Mark

0

Si quelqu'un a besoin d'une version SWIFT. Cela a fonctionné pour moi. Merci @rckoenes pour la réponse objC que j'ai utilisée pour traduire cela.

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

J'ai créé le UITabbarController comme contrôleur rooview de l'application avec UINavigationController pour UIViewController.

Voici un autre exemple: J'ai utilisé xibs pour les contrôleurs de vue.

AppDelegate.m

créer un nom de la méthode: 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]; 


} 

Il est envoyé un texto dans Xcode 9 avec iOS 11.

Questions connexes