10 ответов:
самый простой подход состоит в том, чтобы иметь два вида, которые вы можете переключать их видимость, чтобы указать, какой вид был выбран. Вот пример кода о том, как это можно сделать, определенно не оптимизированный способ обработки представлений, а просто продемонстрировать, как вы можете использовать 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]; } }
Можно, конечно, еще раз-фактор код, чтобы скрыть/показать правильный вид.
в моем случае мои представления довольно сложны, и я не могу просто изменить скрытое свойство разных представлений, потому что это займет слишком много памяти.
Я пробовал несколько решений, и ни одно из них не работало для меня или выполнялось беспорядочно, особенно с titleView navBar, не всегда показывающим segmentedControl при нажатии/появлении представлений.
Я нашел это сообщение в блоге о проблеме, которая объясняет, как это сделать правильно. Кажется, у него была помощь Инженеры Apple на WWDC ' 2010 придумали это решение.
http://redartisan.com/2010/6/27/uisegmented-control-view-switching-revisited
решение в этой ссылке-это лучшее решение, которое я нашел по этому вопросу до сих пор. С небольшой корректировкой он также отлично работал с вкладкой внизу
или если это таблица, вы можете перезагрузить таблицу и в cellForRowAtIndex, заполнить таблицу из разных источников данных на основе выбранного параметра сегмента.
одна из идей заключается в том, чтобы представление с сегментированными элементами управления имело представление контейнера, которое вы заполняете различными подвидами (добавьте в качестве единственного подвида представления контейнера, когда сегменты переключаются). Вы даже можете иметь отдельные контроллеры представления для этих подвидов, хотя вам нужно перенаправить на важные методы, такие как "viewWillAppear" и "viewWillDisappear", если они вам нужны (и им нужно будет сказать, какой навигационный контроллер они находятся).
Как правило, это работает довольно хорошо, потому что вы можете выложить основной вид с контейнером в IB, а подвиды заполнят все пространство, которое контейнер позволяет им иметь (убедитесь, что ваши маски авторазбора настроены правильно).
попробуйте этот код, это поможет вам переключаться между различными видами на изменение сегментов управления сегментом
откройте различные представления при выборе различных сегментов UISegmentControl
попробуйте использовать
SNFSegmentedViewController, компонент с открытым исходным кодом, который делает именно то, что вы ищете с настройкой, какUITabBarController.
из ответа @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
присвоить .Ч
UISegmentedControl *lblSegChange; - (IBAction)segValChange:(UISegmentedControl *) senderобъявить .М
- (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]; } }
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() }управление SegmentedControl 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/
быстрая версия Swift:
@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) { if segmentControl.selectedSegmentIndex == 0 { // do something } else { // do something else } }
Comments