2012-08-27 5 views
6

Sono abbastanza nuovo per lo sviluppo di iOS e sono bloccato. Attualmente sto utilizzando un controller di tabulazione per passare tra due controller di visualizzazione (elenco e visualizzazione mappa). Ciò ha reso più facile l'uso dello storyboard per configurare l'aspetto delle due viste.Come posso creare un UIViewController con due viste che visualizzano l'una o l'altra a seconda del pulsante cliccato

Ora i requisiti sono cambiati e l'app deve avere un controller di visualizzazione con un controllo segmentato che al clic, visualizza l'elenco o la visualizzazione della mappa. Per fare ciò, dovrei creare un controller di visualizzazione in grado di visualizzare la visualizzazione elenco/mappa.

Capisco come funziona la parte del controller segmentato, ma sono solo bloccato su come posso avere due visualizzazioni con l'una o l'altra visualizzate nella stessa area. Come posso avere due viste in un controller di visualizzazione (se possibile, utilizzando lo storyboard)?

Grazie in anticipo!

risposta

7

Non si dovrebbero avere due viste principali in un controller a vista singola, ma è necessario creare un controller di visualizzazione per ogni vista che si desidera mostrare. Tuttavia puoi certamente avere più sotto-visualizzazioni in un unico controller di visualizzazione, che potrebbe essere ciò che funziona per te.

Ci sono un certo numero di approcci per risolvere questo problema, l'approccio corretto sarebbe quello di creare un contenitore UIViewController e aggiungere come suoi figli i 2 viewcontrollers che si desidera mostrare, semplicemente impostando la vista sul controller di visualizzazione si vuoi mostrarlo, ma questo sarebbe probabilmente troppo complicato da quando dici che sei nuovo nello sviluppo di iOS.

Pertanto, una soluzione semplice (non è sicuro se è possibile implementarlo nello storyboard - poiché non mi piace), sarebbe quello di avere un singolo controller di visualizzazione, con le schede e 2 sottoview della vista principale, quindi si può semplicemente passare da una visualizzazione all'altra facendo qualcosa di simile:

[self.view addSubview:view1]; 

// per passare

[view1 removeFromSuperview]; 
[self.view addSubView:view2]; 

in alternativa, non si ha realmente bisogno di rimuoverlo dalla superview ma solo nasconderlo, e poi usare bringSubViewToFront per mostrare la vista di cui hai bisogno.

Se si desidera utilizzare l'altro approccio, consiglierei di cercare questo video sul video del WWDC 2011 intitolato "Implementazione del contenimento di UIViewController". Questa altra domanda dovrebbe essere utile a: UISegmented control with 2 views

Spero che questo aiuti.

4

Utilizzando storyboard API è possibile passare da 2 viewControllers

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIViewController *viewController = [self viewControllerForSegmentIndex:self.typeSegmentedControl.selectedSegmentIndex]; 
    [self addChildViewController:viewController]; 
    viewController.view.frame = self.contentView.bounds; 
    [self.contentView addSubview:viewController.view]; 
    self.currentViewController = viewController; 
} 
- (UIViewController *)viewControllerForSegmentIndex:(NSInteger)index { 
    UIViewController *viewController; 
    switch (index) { 
     case 0: 
      viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"]; 
      break; 
     case 1: 
      viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
      break; 
    } 
    return viewController; 
} 
- (IBAction)segmentChanged:(UISegmentedControl *)sender { 
    UIViewController *viewController = [self viewControllerForSegmentIndex:sender.selectedSegmentIndex]; 
    [self addChildViewController:viewController]; 
    [self transitionFromViewController:self.currentViewController toViewController:viewController duration:0.0 options:UIViewAnimationOptionTransitionNone animations:^{ 
     [self.currentViewController.view removeFromSuperview]; 
     viewController.view.frame = self.contentView.bounds; 
     [self.contentView addSubview:viewController.view]; 
    } completion:^(BOOL finished) { 
     [viewController didMoveToParentViewController:self]; 
     [self.currentViewController removeFromParentViewController]; 
     self.currentViewController = viewController ; 
    }]; 
    self.navigationItem.title = viewController.title; 
} 

Questo è in riferimento alla iOS tutorial da Raywenderlich. Spero che questo aiuti

0

Con Storyboard è possibile in questo modo.

  1. Creare UIViewController con UISegmentControl e UITableView + UITableViewCell aggiunto.

storyboard tableview with segment control http://i39.tinypic.com/dwrn5y.png

  1. Ora si desidera aggiungere MKMapView così, hoverer, se semplicemente tenta di mettere il MapView sul ViewController, verrà aggiunto come nuovo TableView cella, che non è quello che vogliamo.

Storyboard mapview added as tableviewcell http://i39.tinypic.com/ix9fu0.png

Ecco perché non si dovrebbe fare così. Invece, MapView deve essere aggiunto alla lista di Storyboard di ViewControllers

MapView added to Stroyboard viewcontroller view http://i42.tinypic.com/33lcqwy.png

  1. Regolare la dimensione e l'origine del MapView ad essere lo stesso di quelli Tableview.

Adjusting size and origin for MapView http://i42.tinypic.com/2vkhnnl.png

  1. Ora, setHidden su YES per entrambi TableView di MapView, creare e sintetizzare sbocchi per loro. Quindi nel controllo del segmento Cambio valore dell'attrezzo implementato commutazione:

    - (IBAction)switchView:(id)sender { 
        self.theTableView.hidden = !self.theTableView.hidden; 
        self.theMapView.hidden = !self.theMapView.hidden; 
    
        if (!self.theTableView.hidden) { 
         [self.theTableView reloadData]; 
        } 
    } 
    
Problemi correlati