2009-06-26 10 views

risposta

109

L'approccio più semplice consiste nell'avere due viste che è possibile alternare la loro visibilità per indicare quale vista è stata selezionata. Ecco alcuni esempi di codice su come si può fare, sicuramente non un modo ottimizzato per gestire i punti di vista, ma solo per dimostrare come è possibile utilizzare il UISegmentControl per attivare o disattivare la visualizzazione visibile:

- (IBAction)segmentSwitch:(id)sender { 
    UISegmentedControl *segmentedControl = (UISegmentedControl *) sender; 
    NSInteger selectedSegment = segmentedControl.selectedSegmentIndex; 

    if (selectedSegment == 0) { 
    //toggle the correct view to be visible 
    [firstView setHidden:NO]; 
    [secondView setHidden:YES]; 
    } 
    else{ 
    //toggle the correct view to be visible 
    [firstView setHidden:YES]; 
    [secondView setHidden:NO]; 
    } 
} 


Ovviamente è possibile ridimensionare ulteriormente il codice per nascondere/mostrare la vista corretta.

+4

'sicuramente non un modo ottimizzato per gestire i punti di vista ' - perché? –

+3

@AdamWaite perché tutte le viste devono essere memorizzate in modo permanente nella memoria. Se le tue visualizzazioni sono troppo complicate e/o contengono molti altri elementi, ciò influenzerà le prestazioni generali. Quel pezzo di codice potrebbe essere anche rifattorizzato. – Stas

+0

@Stas Hai ragione, è meglio dividere la logica tra più controller di visualizzazione, ciascuno responsabile delle proprie azioni e comportamenti –

17

Oppure se è una tabella, è possibile ricaricare la tabella e in cellForRowAtIndex, popolare la tabella da diverse origini dati in base all'opzione di segmento selezionata.

7

Un'idea è di avere la vista con i controlli segmentati con una vista contenitore che si riempie con le diverse visualizzazioni secondarie (aggiungere come unica sottoview della vista contenitore quando i segmenti sono attivati). Puoi anche avere controller di vista separati per tali sottoview, anche se devi inoltrare metodi importanti come "viewWillAppear" e "viewWillDisappear" se ne hai bisogno (e ti verrà detto che controller di navigazione sono sotto).

genere che funziona abbastanza bene, perché è possibile tracciare la visualizzazione principale con il contenitore in IB, e le subviews riempirà tutto lo spazio che il contenitore permette loro di avere (assicurarsi che le maschere AutoResize sono impostati correttamente).

45

Nel mio caso le mie visualizzazioni sono piuttosto complesse e non posso semplicemente modificare la proprietà nascosta di viste diverse perché richiederebbe troppa memoria.

Ho provato diverse soluzioni e non ha funzionato per me, o eseguito in modo irregolare, specialmente con il titoloView della barra di navigazione non mostra sempre il segmentedControl quando si spinge/popping le viste.

Ho trovato questo post sul blog che spiega come farlo nel modo corretto. Sembra che abbia avuto l'aiuto degli ingegneri Apple al WWDC'2010 per trovare questa soluzione.

http://redartisan.com/2010/6/27/uisegmented-control-view-switching-revisited

La soluzione in questo link è senza dubbio la soluzione migliore che ho trovato sulla questione finora. Con un po 'di regolazione anche funzionato benissimo con un TabBar in fondo

+0

Grazie per l'ottima scoperta. Sicuramente una soluzione bella ed elegante per questa metodologia. – Shiun

+1

Ho provato a farlo funzionare correttamente con la barra degli strumenti in basso senza successo, http://stackoverflow.com/questions/4748120/uisegmentedcontroller-to-switch-between-uiviewcontrollers-calendar-app-style Puoi aiutarmi per favore ? – Erik

+0

C'è un modo per avere un'animazione di flip orizzontale tra le viste. Oppure funziona solo senza animazione? – aneuryzm

3

Provare a utilizzare SNFSegmentedViewController, un componente open source che fa esattamente quello che stai cercando con una configurazione come UITabBarController.

2

Assegna .H in

UISegmentedControl *lblSegChange; 

- (IBAction)segValChange:(UISegmentedControl *) sender 

Declare.M

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

if(sender.selectedSegmentIndex==0) 
{ 
    viewcontroller1 *View=[[viewcontroller alloc]init]; 
    [self.navigationController pushViewController:view animated:YES]; 
} 
else 
{ 
    viewcontroller2 *View2=[[viewcontroller2 alloc]init]; 
    [self.navigationController pushViewController:view2 animated:YES]; 
} 
} 
2

Dalla risposta di @Ronnie Liew, creo questo:

// 
// ViewController.m 
// ResearchSegmentedView 
// 
// Created by Ta Quoc Viet on 5/1/14. 
// Copyright (c) 2014 Ta Quoc Viet. All rights reserved. 
// 
#define SIZE_OF_SEGMENT 56 
#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 
@synthesize theSegmentControl; 
UIView *firstView; 
UIView *secondView; 
CGRect leftRect; 
CGRect centerRect; 
CGRect rightRect; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    leftRect = CGRectMake(-self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT); 
    centerRect = CGRectMake(0, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT); 
    rightRect = CGRectMake(self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT); 

    firstView = [[UIView alloc] initWithFrame:centerRect]; 
    [firstView setBackgroundColor:[UIColor orangeColor]]; 
    secondView = [[UIView alloc] initWithFrame:rightRect]; 
    [secondView setBackgroundColor:[UIColor greenColor]]; 
    [self.view addSubview:firstView]; 
    [self.view addSubview:secondView]; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)segmentSwitch:(UISegmentedControl*)sender { 
    NSInteger selectedSegment = sender.selectedSegmentIndex; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.2]; 
    if (selectedSegment == 0) { 
     //toggle the correct view to be visible 
     firstView.frame = centerRect; 
     secondView.frame = rightRect; 
    } 
    else{ 
     //toggle the correct view to be visible 
     firstView.frame = leftRect; 
     secondView.frame = centerRect; 
    } 
    [UIView commitAnimations]; 
} 
@end 
1

Un rapido Versione Swift:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) { 

    if segmentControl.selectedSegmentIndex == 0 { 

     // do something 
    } else { 

     // do something else 
    } 
} 
Problemi correlati