Jak używać UISegmentedControl do przełączania widoków?

Próbuję dowiedzieć się, jak używać różnych stanów UISegmentedControl do przełączania widoków, podobnie jak Apple robi to w App Store, gdy przełącza się między "Top Paid" i "Top Free".

Author: Anbu.karthik, 2009-06-26

10 answers

Najprostszym podejściem jest posiadanie dwóch widoków, które można przełączyć na ich widoczność, aby wskazać, który Widok został wybrany. Oto przykładowy kod, w jaki sposób można to zrobić, zdecydowanie nie jest to zoptymalizowany sposób obsługi widoków, ale tylko po to, aby zademonstrować, w jaki sposób można użyć UISegmentControl do przełączania widocznego widoku:

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


Możesz oczywiście ponownie uwzględnić kod, aby ukryć / pokazać odpowiedni Widok.

 111
Author: Ronnie Liew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-27 00:38:49

W moim przypadku moje poglądy są dość złożone i nie mogę po prostu zmienić ukrytej własności różnych poglądów, ponieważ zajęłoby to zbyt dużo pamięci.

Próbowałem kilku rozwiązań i Żadne z nich nie zadziałało dla mnie, lub Wykonało się nieregularnie, szczególnie z titleView navBar nie zawsze pokazując segmentedControl podczas przesuwania / popping widoków.

Znalazłem ten wpis na blogu o problemie, który wyjaśnia, jak to zrobić we właściwy sposób. Wydaje się, że miał pomoc inżynierów Apple w WWDC'2010, aby wymyślić To rozwiązanie.

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

Rozwiązanie w tym linku jest najlepszym rozwiązaniem, jakie znalazłem w tej kwestii do tej pory. Przy odrobinie regulacji działał również dobrze z paskiem tabulacji na dole

 45
Author: Marc M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-08 10:25:53

Lub jeśli jest tabelą, możesz przeładować tabelę i w cellForRowAtIndex wypełnić tabelę z różnych źródeł danych w oparciu o wybraną opcję segmentu.

 17
Author: lostInTransit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 06:19:08

Jednym z pomysłów jest to, aby Widok Z segmentowymi kontrolkami miał widok kontenera, który wypełniasz różnymi podglądami (Dodaj jako jedyny podgląd widoku kontenera, gdy segmenty są przełączane). Możesz nawet mieć osobne Kontrolery widoku dla tych podwizów, chociaż musisz przejść do ważnych metod, takich jak "viewWillAppear" i "viewWillDisappear", jeśli ich potrzebujesz (i będą musieli być poinformowani, pod jakim kontrolerem nawigacyjnym się znajdują).

Ogólnie to działa ładnie cóż, ponieważ możesz rozłożyć główny widok za pomocą kontenera w IB, a podwidywacze wypełnią dowolne miejsce, które kontener im pozwala (upewnij się, że maski automatycznej edycji są prawidłowo skonfigurowane).

 7
Author: Kendall Helmstetter Gelner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 15:00:21

Wypróbuj ten kod, pomoże Ci to przełączać się między różnymi widokami na zmieniających się segmentach kontroli segmentu

Otwórz różne widoki na wybór różnych segmentów UISegmentControl

 7
Author: Soniya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-27 05:37:32

Spróbuj użyć SNFSegmentedViewController, komponent open-source, który robi dokładnie to, czego szukasz za pomocą konfiguracji takiej jak UITabBarController.

 3
Author: sethfri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-29 22:02:13

Z odpowiedzi @ Ronnie Liew, tworzę to:

//
//  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
 2
Author: Envil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-30 19:04:28

Przypisać .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
Author: Anbu.karthik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 10:23:17

Wersja Swift:

Kontroler widoku nadrzędnego jest odpowiedzialny za ustawienie rozmiaru i położenia widoku każdego kontrolera widoku podrzędnego. Widok kontrolera widoku potomnego staje się częścią hierarchii kontrolera widoku nadrzędnego.

Define Lazy properties:

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

Pokaż/Ukryj Kontrolery Widoku Potomnego:

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

Zarządzaj SegmentedControl tapEvent

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

I oczywiście możesz używać kontrolera widoku dziecka klasy:

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

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

 2
Author: SlavisaPetkovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-29 15:22:17

Szybka wersja Swift:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}
 1
Author: Bright Future,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 09:50:36