2010-08-19 9 views
1

J'ai une application simple avec deux écrans de base, un UIMapView et un UITableView. Je voudrais avoir une barre d'outils en bas avec quelques boutons et un UISegmentedControl avec deux segments: "Map" et "Table". (La mise en page est similaire à l'application Google Maps livrée avec l'iPhone.) Comment conserver la même barre d'outils lors de la présentation de UIMapView (avec un UIMapViewController) ou de UITableView (avec UITableViewController) lorsque l'utilisateur passe d'un mode à l'autre le contrôle segmenté? Bien sûr, je peux simplement créer une barre d'outils identique pour chacune des deux vues différentes et les afficher séparément, mais y a-t-il un meilleur moyen?Comment puis-je utiliser un seul UIToolbar avec plusieurs UIViewControllers différents?

+1

vous voulez dire MKMapView, il n'y a pas UIMapView – Felix

Répondre

0

vous pouvez utiliser un seul contrôleur de vue, et ajouter tous les points de vue (UIMapView, uitableview, etc.) à votre point de vue et simplement afficher/masquer les vues correctes lorsque vous cliquez sur le contrôle segmentée

avec une telle application simple sans beaucoup de vues, vous ne devriez pas avoir un fichier de contrôleur de vue en désordre/en cluster et pouvez facilement afficher/masquer ces 2 vues.

peut-être utiliser une animation entre le changement de vue il semble bien

2

Ecrire un UIViewController qui gère votre 2 VC et les transitions entre les MKMapView et UITableView en réponse à la commande segmentée. Configurez d'abord la plume pour ce nouveau VC dans Interface Builder: ajoutez un UISegementedControl et un simple UIView (contentView). Le fichier d'interface contient des références à l'interface utilisateur des éléments et à 2 VC + une action pour répondre au contrôle segmentée:

// 
// MapAndTableViewController.h 
// 

#import <UIKit/UIKit.h> 

#import "MyMapViewController.h" 
#import "MyTableViewController.h" 

@interface MapAndTableViewController : UIViewController { 

    IBOutlet UISegmentedControl* segmentedControl; 
    IBOutlet UIView* contentView; 
    UIViewController* firstVC; 
    UIViewController* secondVC; 
} 


-(IBAction) valueChanged:(UISegmentedControl*) sender; 

@end 

Mise en œuvre:

// 
// MapAndTableViewController.m 
// 

#import "MapAndTableViewController.h" 


@implementation MapAndTableViewController 

-(IBAction) valueChanged:(UISegmentedControl*) sender { 

    if (sender.selectedSegmentIndex == 0) { 
     [UIView transitionFromView:[contentView.subviews lastObject] toView:firstVC.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 
    } 
    if (sender.selectedSegmentIndex == 1) { 
     [UIView transitionFromView:[contentView.subviews lastObject] toView:secondVC.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 
    } 

} 

-(void)awakeFromNib { 
    firstVC = [[MyMapViewController alloc] initWithNibName:@"MyMapViewController" bundle:nil]; 
    secondVC = [[MyTableViewController alloc] initWithNibName:@"MyTableViewController" bundle:nil]; 

} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [contentView addSubview:firstVC.view];  
} 

- (void)dealloc { 
    [firstVC release]; 
    [secondVC release]; 
    [super dealloc]; 
}  

@end 

Dans la méthode valueChanged vous remplacez la vue actuelle et animer la transition.

Notez que les vues firstVC.view et secondVC.view sont créées lors du premier accès de la propriété view de chaque VC.