Я пытаюсь понять, как использовать разные состояния UISegmentedControl для переключения представлений, подобно тому, как Apple делает это в App Store при переключении между "Top Paid" и "Top Free".
Как использовать UISegmentedControl для переключения представлений?
Ответ 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 заполнит все пространство, которое контейнер позволяет им (убедитесь, что ваши маски авторезистирования настроены правильно).
Ответ 5
Попробуйте этот код. Это поможет вам переключаться между различными представлениями на изменение сегментов сегмента COntrol.
Откройте различные представления при выборе разных сегментов UISegmentControl
Ответ 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
}
}