3

J'essaie faire quelque chose similaire (mais pas exactement comme) l'application email trouvé sur le iPad.contrôleur de navigation multi-niveaux sur le côté gauche de UISplitView avec une petite torsion

Plus précisément, je voudrais créer un onglet basée sur l'application, mais chaque onglet présenterais l'utilisateur un autre UISplitView. Chaque UISplitView contient un affichage maître et un affichage détaillé (évidemment).

Dans chaque UISplitView, je souhaite que le maître soit un contrôleur de navigation multiniveau où les nouveaux contrôleurs UIView sont poussés (ou retirés) de la pile. Ce type de navigation dans UISplitView est l'endroit où l'application est similaire à l'application de messagerie native. Au meilleur de ma connaissance, le seul endroit qui a décrit un "splitviewcontroller" décent dans un uitabbarcontroller est ici: UISplitViewController in a TabBar (UITabBarController)? et j'ai essayé de suivre la réponse acceptée.

La solution acceptée semble fonctionner pour moi (c'est-à-dire que j'obtiens un contrôleur de barre d'onglets qui me permet de basculer entre différents UISplitViews). Le problème est que je ne sais pas comment faire du côté gauche de l'UISplitView un contrôleur de navigation à plusieurs niveaux. Voici le code que j'ai utilisé dans le délégué de mon application pour créer la "vue partagée" initiale à l'intérieur d'un contrôleur de barre d'onglets "(c'est à peu près comme suggéré dans le lien ci-dessus).

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

    NSMutableArray   *tabArray    = [NSMutableArray   array]; 

    NSMutableArray   *array     = [NSMutableArray   array]; 
    UISplitViewController *splitViewController = [[UISplitViewController alloc] init];  
    MainViewController  *viewCont    = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; 
    [array     addObject:viewCont]; 
    [viewCont    release]; 
    viewCont          = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 
    [array     addObject:viewCont]; 
    [viewCont    release]; 
    [splitViewController setViewControllers:array]; 
    [tabArray    addObject:splitViewController]; 
    [splitViewController release]; 



    array           = [NSMutableArray   array]; 
    splitViewController        = [[UISplitViewController alloc] init]; 
    viewCont          = [[Master2    alloc] initWithNibName:@"Master2" bundle:nil]; 
    [array     addObject:viewCont]; 
    [viewCont    release];  
    viewCont          = [[Slave2 alloc]   initWithNibName:@"Slave2" bundle:nil]; 
    [array     addObject:viewCont]; 
    [viewCont    release];  
    [splitViewController setViewControllers:array]; 
    [tabArray    addObject:splitViewController];  
    [splitViewController release]; 

    // Add the tab bar controller's current view as a subview of the window 
    [tabBarController setViewControllers:tabArray]; 

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

    return YES; 
} 

la classe MainViewController est un UIViewController qui contient la méthode suivante:

- (IBAction)push_me:(id)sender { 
    M2 *m2 = [[[M2 alloc] initWithNibName:@"M2" bundle:nil] autorelease]; 
    [self.navigationController pushViewController:m2 animated:YES]; 
} 

cette méthode est fixée (par l'intermédiaire de l'interface générateur) à une UIButton trouvés dans MainViewController.xib De toute évidence, le procédé ci-dessus (push_me) est censé créer un deuxième UIViewController (appelé m2) et pousser m2 dans la vue sur le côté gauche de la vue partagée lorsque le bouton UIButton est enfoncé. Et pourtant, il ne fait rien lorsque le bouton est pressé (même si je peux dire que la méthode est appelée).

Réflexions sur l'endroit où je me trompe?

TIA! Êtes vous sûr que MainViewController est une sous-classe de UINavigationController?

Répondre

0

Êtes-vous sûr que MainViewController est une sous-classe de UINavigationController? Si vous voulez pouvoir activer/désactiver les contrôleurs, alors le contrôleur principal doit être un contrôleur de navigation (ou une sous-classe), puis vous devez pousser les contrôleurs (par exemple les contrôleurs TableView) sur ce contrôleur. Vous pouvez voir cette structure dans le projet splitView par défaut (ouvrir IB et inspecter les vues).

Voici un tutoriel décent sur UISplitViewController: http://mobiforge.com/developing/story/developing-split-view-based-apps-ipad

0

Créer une sous-classe de votre (multi-niveaux) maître contrôleur de navigation et passer outre la méthode suivante:

- separateSecondaryViewControllerForSplitViewController: 

Dans la méthode surchargée effectuer le super Méthode de classe et vérifiez si vous souhaitez diviser le contrôleur de vue renvoyé à partir de celui-ci, sinon remettez-le en arrière en appelant la méthode de réduction:

Exemple de modèle dans Swift:

import UIKit 

class MasterNavigationController: UINavigationController { 

    override func separateSecondaryViewControllerForSplitViewController(splitViewController: UISplitViewController) -> UIViewController? { 

     // Separate a view controller from master navigation controller 
     if let secondaryViewController = super.separateSecondaryViewControllerForSplitViewController(splitViewController) { 

      if /* Check if secondaryViewController is your Detail View Controller (you can check for its class or restorationIdentifier for example) */ { 

       return secondaryViewController 

      } else { 

       // Remerges the separated view controller back to the master navigation controller 
       super.collapseSecondaryViewController(secondaryViewController, forSplitViewController: splitViewController) 
      } 
     } 
     return nil 
    } 
} 
Questions connexes