Frage

Ich versuche, herauszufinden, wie man die verschiedenen Zustände eines UISegmentedControl verwenden Ansichten zu wechseln, ähnlich wie Apple-tut es im Store App, wenn zwischen ‚Top Paid‘ und ‚Top Free‘ switiching.

War es hilfreich?

Lösung

Der einfachste Ansatz ist zwei Ansichten zu haben, dass Sie ihre Sichtbarkeit umschalten kann, um anzuzeigen, welche Ansicht gewählt wurde. Hier ist ein Beispielcode, wie es getan werden kann, auf keinen Fall eine optimierte Art und Weise die Ansichten zu handhaben, aber nur um zu zeigen, wie Sie verwenden können, die UISegmentControl die sichtbare Ansicht wechseln:

- (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];
  }
}


Sie können den Code natürlich weiter erneut Faktor, der die rechte Ansicht aus- / eingeblendet.

Andere Tipps

In meinem Fall sind meine Ansichten ziemlich komplex, und ich kann nicht nur die verborgene Eigenschaft ändern verschiedener Ansichten, weil es zu viel Speicher benötigen würde.

Ich habe versucht, verschiedene Lösungen und nicht von ihnen für mich gearbeitet, oder erratisch durchgeführt, speziell mit dem Titleview des navBar nicht immer die segmentedControl zeigt, wenn Schiebe- / popping Ansichten.

Ich fand diese Blog-Post über das Problem, das erklärt, wie es in der richtigen Art und Weise zu tun. Scheint er die Hilfe von Apple Ingenieure bei WWDC'2010 hatte mit dieser Lösung zu kommen.

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

Die Lösung in diesem Link ist zweifellos die beste Lösung, die ich bisher über das Thema gefunden habe. Mit einem wenig Anpassungs arbeitete sie auch mit einem tabBar am Boden fein

oder wenn sie ein Tisch, können Sie die Tabelle und in cellForRowAtIndex, füllen Sie die Tabelle aus unterschiedlichen Datenquellen auf der Basis des Segments Option neu zu laden.

Eine Idee ist, die Ansicht mit den segmentierten Kontrollen haben hat einen Container Ansicht, die Sie mit den verschiedenen Subviews füllen (als einziger subview der Behälter Ansicht hinzufügen, wenn die Segmente umgeschaltet werden). Sie können sogar separate Ansicht-Controller für die Subviews haben, obwohl Sie über wichtige Methoden wie „viewWillAppear“ zu übermitteln haben und „viewWillDisappear“, wenn Sie sie benötigen (und sie werden müssen gesagt, was Navigation-Controller sind sie unter).

Im Allgemeinen, das ziemlich gut funktioniert, weil Sie die Hauptansicht mit Behälter in IB auslegen kann und die Subviews füllen, was Raum der Behälter ihnen (stellen Sie sicher, Ihre Autoresize Masken eingerichtet sind richtig) können.

Versuchen Sie diesen Code, dieser Wille hilft Ihnen, zwischen verschiedenen Ansichten auf wechselnden Segmenten Segmentsteuerung wechseln

öffnen verschiedene Ansichten auf verschiedenen Segmenten UISegmentControl Auswahl

Versuchen Sie es mit SNFSegmentedViewController , eine Open-Source-Komponente, die genau das tut, was Sie suchen mit Setup wie UITabBarController.

Aus der Antwort von @Ronnie Liew, schaffe ich dies:

//
//  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

zuordnen · H in

 UISegmentedControl *lblSegChange;

- (IBAction)segValChange:(UISegmentedControl *) sender

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

Swift-Version:

Die Eltern-View-Controller ist verantwortlich für die Größe und die Position der Ansicht jedes Kind-View-Controller einstellen. Der Blick des Kindes View-Controller wird ein Teil der Ansichtshierarchie übergeordneten View-Controller.

definiert faul Eigenschaften:

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
}()

Show / Hide Child View-Controller:

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()
}

Manage SegmentedControl tapEvent

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

Und natürlich können Sie in Ihren Kind-View-Controller-Klassen verwenden:

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")
}

Referenz: https://cocoacasts.com/managing-view-controllers-with -container-view-Controller /

Eine schnelle Swift Version:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top