2010-05-03 4 views
43

Je crée généralement mes projets sans IB-stuff. La première chose que je fais est de supprimer toutes les références à xibs, outlets mise à jour plist, etc et ainsi de suite. Pas de problèmes, fonctionne très bien (dans mon monde)!UISplitViewController par programme sans nib/xib

Maintenant, je viens d'installer 3.2 et j'ai essayé de développer ma première application iPad. En suivant la même procédure que précédemment, j'ai créé un projet d'application basé sur UISplitView et enlevé toutes les choses de l'IB. Aussi, j'ai suivi la section dans les documents de référence d'Apple: Creating a Split View Controller Programmatically, mais néanmoins, la vue principale n'est jamais montrée, seule la vue détaillée est (peu importe l'orientation). J'ai vraiment essayé de regarder cela attentivement, mais je ne peux pas comprendre ce que j'ai manqué.

Existe-t-il un exemple fonctionnel de UISplitViewController sans que les plumes ne flottent quelque part? J'ai googlé mais je n'en ai pas trouvé. Ou savez-vous ce que j'ai probablement manqué?

+8

"Je crée habituellement mes projets sans IB-stuff." <- +1 pour cela. C'est ainsi que fonctionne la programmation, je le fais aussi. Tu gères! –

Répondre

55

Déclarez votre splitviewcontroller dans votre tête de délégué, utilisez quelque chose comme ceci dans votre didfinishlaunching

vous assurer que vous ajoutez le UISplitViewControllerDelegate au fichier d'en-tête detailedViewController et que vous avez les méthodes déléguées aswell. ne pas oublier d'importer des fichiers d'en-tête pertinents

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  

    splitViewController = [[UISplitViewController alloc] init]; 

    rootViewController *root = [[rootViewController alloc] init]; 
    detailedViewController *detail = [[detailedViewController alloc] init]; 

    UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:root]; 

    UINavigationController *detailNav = [[UINavigationController alloc] initWithRootViewController:detail]; 

    splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil]; 
    splitViewController.delegate = detail; 

    [window addSubview:splitViewController.view]; 

EDIT - selon excellente suggestion de Scott ci-dessous, ne pas ajouter à la fenêtre sous-vue, au lieu

[self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    [window makeKeyAndVisible]; 
    return YES; 
} 


//detailedView delegate methods 
- (void)splitViewController:(UISplitViewController*)svc 
    willHideViewController:(UIViewController *)aViewController 
      withBarButtonItem:(UIBarButtonItem*)barButtonItem 
     forPopoverController:(UIPopoverController*)pc 
{ 
    [barButtonItem setTitle:@"your title"]; 



    self.navigationItem.leftBarButtonItem = barButtonItem; 
} 


- (void)splitViewController:(UISplitViewController*)svc 
    willShowViewController:(UIViewController *)aViewController 
    invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    self.navigationItem.leftBarButtonItem = nil; 
} 

Je préfère également le code à IB ;-)

+5

Cette réponse est exactement ce que je cherchais. Une question: Dans le code d'exemple de référence d'Apple (http://developer.apple.com/library/ios/ipad/#samplecode/MultipleDetailViews/Listings/Classes_RootViewController_m.html), ils gèrent le délégué UiSplitviewcontroller dans le contrôleur de vue racine. Vous le manipulez dans le contrôleur détaillé à la place. Y a-t-il une raison pour l'un ou pour l'autre? –

+0

Le contrôleur qui devient délégué est à vous. Si vous sentez que le 'detailViewController' va commander * *, le' rootViewController' est complètement correct :). Bien que dans ce cas, vous voulez probablement renommer vos variables en quelque chose qui correspond à votre conception (par exemple 'listViewController' et' mainViewController' pour 'rootViewController' et' detailedViewController' respectivement) – nacho4d

22

Ancien thread, mais pensé que j'épargnerais le temps de lecteur + chagrin lorsque la technique ci-dessus ne parvient pas à produire un UISplitViewController qui répond correctement aux événements de changement d'orientation du périphérique. Vous aurez besoin de:

  1. Assurez-vous toutes les vues subordonnés répondent correctement à shouldAutorotateToInterfaceOrientation. Rien de nouveau ici.
  2. Plutôt que d'ajouter le point de vue de la UISplitViewController à la fenêtre principale,

    [window addSubview:splitViewController.view]; // don't do this 
    

    à la place réglons le contrôleur principal de la racine de la fenêtre à l'UISplitViewController:

    [self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    

Ajout de vue de l'splitviewcontroller en tant que sous-vue de la fenêtre principale (à peine) lui permet de co-présenter avec des vues de frère, mais il ne vole pas avec le cas d'utilisation prévu de UISplitViewController. Un UISplitViewController est une vue Highlander; il ne peut y avoir qu'un.

3

Je venais de rencontrer le même problème. assurez-vous que votre enfant viewController de splitview peut Autorotate à l'orientation de l'interface.

vous pouvez changer la fonction dans votre childViewController comme ceci:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

alors la vue principale est affichée.

+1

Je t'aime! Mon problème a été résolu! – mineschan

Questions connexes