2009-06-26 2 views

ответ

109

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


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

+4

«определенно не оптимизированный способ справиться с видом ' - Зачем? –

+3

@AdamWaite, потому что все представления должны храниться в памяти постоянно. Если ваши взгляды слишком сложны и/или содержат много других элементов, это повлияет на общую производительность. Эта часть кода также может быть реорганизована. – Stas

+0

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

17

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

7

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

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

45

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

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

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

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

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

+0

Благодарим вас за отличную находку. Определенно хорошее и элегантное решение для этой методологии. – Shiun

+1

Я попытался заставить это работать правильно с панелью инструментов внизу без успеха, http://stackoverflow.com/questions/4748120/uisegmentedcontroller-to-switch-between-uiviewcontrollers-calendar-app-style Можете ли вы, пожалуйста, помочь мне ? – Erik

+0

Есть ли способ иметь горизонтальную флип-анимацию между представлениями. Или это работает без анимации? – aneuryzm

3

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

2

Присвоить .Н в

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

Из ответа @Ronnie Лью, я создаю это:

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

Быстрый Swift Версия:

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) { 

    if segmentControl.selectedSegmentIndex == 0 { 

     // do something 
    } else { 

     // do something else 
    } 
}