Как использовать UISegmentedControl для переключения представлений?

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

Ответ 1

Самый простой подход - иметь два представления, которые вы можете переключить на их видимость, чтобы указать, какое представление было выбрано. Вот пример кода, как это можно сделать, определенно не оптимизированный способ обработки представлений, а просто для демонстрации того, как вы можете использовать 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];
  }
}


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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 6

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

Ответ 7

Назначить .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];
 }
} 

Ответ 8

Из ответа @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

Ответ 9

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

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}