Domanda

Sto cercando di capire come utilizzare i diversi stati di UISegmentedControl per cambiare visualizzazione, in modo simile a come fa Apple nell'App Store quando si passa da "Top Paid" a "Top Free".

È stato utile?

Soluzione

L'approccio più semplice consiste nell'avere due viste che è possibile attivare o disattivare la loro visibilità per indicare quale vista è stata selezionata. Ecco un codice di esempio su come può essere fatto, sicuramente non un modo ottimizzato per gestire le viste ma solo per dimostrare come è possibile utilizzare UISegmentControl per attivare / disattivare la vista 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 puoi ricodificare ulteriormente il codice per nascondere / mostrare la vista corretta.

Altri suggerimenti

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

Ho provato diverse soluzioni e nessuna di esse ha funzionato per me, o si è comportata in modo irregolare, specialmente con il titleView della barra di navigazione che non mostrava sempre il segmentedControl quando si spingevano / scattavano le viste.

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

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

La soluzione in questo link è senza dubbio la migliore soluzione che ho trovato sul problema finora. Con un po 'di regolazione ha funzionato bene anche con una tabBar in basso

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

Un'idea è di avere la vista con i controlli segmentati avere una vista contenitore che si riempia con le diverse viste secondarie (aggiungere come unica vista secondaria della vista contenitore quando i segmenti sono attivati). Puoi anche avere controller di visualizzazione separati per quelle subview, anche se devi inoltrare metodi importanti come & Quot; viewWillAppear & Quot; e " viewWillDisappear " se ne hai bisogno (e dovranno essere informati su quale controller di navigazione si trovano).

In genere funziona abbastanza bene perché puoi disporre la vista principale con il contenitore in IB e le viste secondarie riempiranno tutto lo spazio che il contenitore consente loro di avere (assicurati che le maschere di ridimensionamento automatico siano impostate correttamente).

Prova questo codice, questo ti aiuterà a passare da una vista all'altra cambiando segmenti di Segmento COntrol

Apri diverse visualizzazioni sulla selezione di diversi segmenti di UISegmentControl

Prova a utilizzare SNFSegmentedViewController , un componente open source che fa esattamente quello che stai cercando con un'impostazione come UITabBarController.

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

Assegna .H in

 UISegmentedControl *lblSegChange;

- (IBAction)segValChange:(UISegmentedControl *) sender

Dichiara .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];
 }
} 

Versione Swift:

Il controller della vista padre è responsabile dell'impostazione delle dimensioni e della posizione della vista di ciascun controller della vista figlio. La vista del controller di visualizzazione figlio diventa parte della gerarchia di visualizzazione del controller di vista padre.

Definisci proprietà pigre:

private lazy var summaryViewController: SummaryViewController = {
   // Load Storyboard
   let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

   // Instantiate View Controller
   var viewController = storyboard.instantiateViewController(withIdentifier: "SummaryViewController") as! SummaryViewController

   // Add View Controller as Child View Controller
   self.add(asChildViewController: viewController)

   return viewController
}()

private lazy var sessionsViewController: SessionsViewController = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "SessionsViewController") as! SessionsViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

Mostra / nascondi controller vista figlio:

private func add(asChildViewController viewController: UIViewController) {
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    view.addSubview(viewController.view)

    // Configure Child View
    viewController.view.frame = view.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

private func remove(asChildViewController viewController: UIViewController) {
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

Gestisci SegmentedControl tapEvent

private func updateView() {
    if segmentedControl.selectedSegmentIndex == 0 {
        remove(asChildViewController: sessionsViewController)
        add(asChildViewController: summaryViewController)
    } else {
        remove(asChildViewController: summaryViewController)
        add(asChildViewController: sessionsViewController)
    }
}

E ovviamente puoi usare le classi del controller della vista figlio:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("Summary View Controller Will Appear")
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    print("Summary View Controller Will Disappear")
}

Riferimento: https://cocoacasts.com/managing-view-controllers-with -container-view-controller /

Una versione rapida di Swift:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top