Как использовать UISegmentedControl для переключения представлений? - PullRequest
80 голосов
/ 26 июня 2009

Я пытаюсь выяснить, как использовать различные состояния UISegmentedControl для переключения представлений, подобно тому, как это делает Apple в App Store при переключении между «Top Paid» и «Top Free».

Ответы [ 10 ]

111 голосов
/ 26 июня 2009

Самый простой подход состоит в том, чтобы иметь два вида, которые можно переключать их видимость, чтобы указать, какой вид был выбран. Вот пример кода о том, как это можно сделать, определенно не оптимизированный способ обработки представлений, а просто демонстрация того, как вы можете использовать UISegmentControl для переключения видимого представления:

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


Конечно, вы можете еще раз изменить код, чтобы скрыть / показать правильный вид.

45 голосов
/ 08 сентября 2010

В моем случае мои представления довольно сложны, и я не могу просто изменить скрытое свойство разных представлений, потому что это заняло бы слишком много памяти.

Я пробовал несколько решений, и ни одно из них не работало для меня или не работало с ошибками, особенно с titleView панели навигации, не всегда показывающей segmentedControl при нажатии / выталкивании.

Я нашел этот пост в блоге о проблеме, которая объясняет, как это сделать правильно. Похоже, он помог инженерам Apple на WWDC'2010, чтобы придумать это решение.

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

Решение по этой ссылке - лучшее решение, которое я нашел до сих пор. С небольшой настройкой он также работал нормально с панелью управления внизу

17 голосов
/ 26 июня 2009

Или, если это таблица, вы можете перезагрузить таблицу и в cellForRowAtIndex заполнить таблицу из разных источников данных на основе выбранной опции сегмента.

7 голосов
/ 27 июня 2012

Попробуйте этот код, это поможет вам переключаться между различными представлениями на изменяющихся сегментах сегмента управления

Открытие разных представлений при выборе разных сегментов UISegmentControl

7 голосов
/ 26 июня 2009

Одна идея состоит в том, чтобы у представления с сегментированными элементами управления было представление контейнера, которое вы заполняете различными подпредставлениями (добавляйте как отдельное подпредставление представления контейнера, когда сегменты переключаются). Вы даже можете иметь отдельные контроллеры представлений для этих подпредставлений, хотя вам нужно перенаправить на важные методы, такие как «viewWillAppear» и «viewWillDisappear», если они вам нужны (и им нужно будет сказать, какой контроллер навигации они используют).

Как правило, это работает довольно хорошо, потому что вы можете разметить основной вид с контейнером в IB, и подвиды будут заполнять все пространство, которое им позволяет контейнер (убедитесь, что маски автоматического изменения размера установлены правильно).

3 голосов
/ 08 июля 2013

Попробуйте использовать SNFSegmentedViewController, компонент с открытым исходным кодом, который делает именно то, что вы ищете, с настройкой типа UITabBarController.

2 голосов
/ 29 марта 2018

Swift версия:

Родительский контроллер представления отвечает за установку размера и положения представления каждого дочернего контроллера представления. Представление дочернего контроллера представления становится частью иерархии представления родительского контроллера представления.

Определите ленивые свойства:

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

Показать / Скрыть дочерние контроллеры представления:

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

Управление сегментированным элементом управления tapEvent

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

И, конечно, вы можете использовать в классах контроллера дочерних представлений:

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

Ссылка: https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/

2 голосов
/ 30 апреля 2014

Из ответа @Ronnie Liew я создаю это:

//
//  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 голосов
/ 10 октября 2013

Назначить .H в

 UISegmentedControl *lblSegChange;

- (IBAction)segValChange:(UISegmentedControl *) sender

Объявить .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];
 }
} 
1 голос
/ 11 ноября 2016

Быстрая версия Swift:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}
...