Jak używać UISegmentedControl do przełączania widoków?
Próbuję dowiedzieć się, jak używać różnych stanów UISegmentedControl do przełączania widoków, podobnie jak Apple robi to w App Store, gdy przełącza się między "Top Paid" i "Top Free".
10 answers
Najprostszym podejściem jest posiadanie dwóch widoków, które można przełączyć na ich widoczność, aby wskazać, który Widok został wybrany. Oto przykładowy kod, w jaki sposób można to zrobić, zdecydowanie nie jest to zoptymalizowany sposób obsługi widoków, ale tylko po to, aby zademonstrować, w jaki sposób można użyć UISegmentControl do przełączania widocznego widoku:
- (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];
}
}
Możesz oczywiście ponownie uwzględnić kod, aby ukryć / pokazać odpowiedni Widok.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-27 00:38:49
W moim przypadku moje poglądy są dość złożone i nie mogę po prostu zmienić ukrytej własności różnych poglądów, ponieważ zajęłoby to zbyt dużo pamięci.
Próbowałem kilku rozwiązań i Żadne z nich nie zadziałało dla mnie, lub Wykonało się nieregularnie, szczególnie z titleView navBar nie zawsze pokazując segmentedControl podczas przesuwania / popping widoków.
Znalazłem ten wpis na blogu o problemie, który wyjaśnia, jak to zrobić we właściwy sposób. Wydaje się, że miał pomoc inżynierów Apple w WWDC'2010, aby wymyślić To rozwiązanie.
Http://redartisan.com/2010/6/27/uisegmented-control-view-switching-revisited
Rozwiązanie w tym linku jest najlepszym rozwiązaniem, jakie znalazłem w tej kwestii do tej pory. Przy odrobinie regulacji działał również dobrze z paskiem tabulacji na dole
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-08 10:25:53
Lub jeśli jest tabelą, możesz przeładować tabelę i w cellForRowAtIndex wypełnić tabelę z różnych źródeł danych w oparciu o wybraną opcję segmentu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 06:19:08
Jednym z pomysłów jest to, aby Widok Z segmentowymi kontrolkami miał widok kontenera, który wypełniasz różnymi podglądami (Dodaj jako jedyny podgląd widoku kontenera, gdy segmenty są przełączane). Możesz nawet mieć osobne Kontrolery widoku dla tych podwizów, chociaż musisz przejść do ważnych metod, takich jak "viewWillAppear" i "viewWillDisappear", jeśli ich potrzebujesz (i będą musieli być poinformowani, pod jakim kontrolerem nawigacyjnym się znajdują).
Ogólnie to działa ładnie cóż, ponieważ możesz rozłożyć główny widok za pomocą kontenera w IB, a podwidywacze wypełnią dowolne miejsce, które kontener im pozwala (upewnij się, że maski automatycznej edycji są prawidłowo skonfigurowane).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 15:00:21
Wypróbuj ten kod, pomoże Ci to przełączać się między różnymi widokami na zmieniających się segmentach kontroli segmentu
Otwórz różne widoki na wybór różnych segmentów UISegmentControl
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-27 05:37:32
Spróbuj użyć SNFSegmentedViewController
, komponent open-source, który robi dokładnie to, czego szukasz za pomocą konfiguracji takiej jak UITabBarController
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-29 22:02:13
Z odpowiedzi @ Ronnie Liew, tworzę to:
//
// 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-30 19:04:28
Przypisać .H in
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];
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 10:23:17
Wersja Swift:
Kontroler widoku nadrzędnego jest odpowiedzialny za ustawienie rozmiaru i położenia widoku każdego kontrolera widoku podrzędnego. Widok kontrolera widoku potomnego staje się częścią hierarchii kontrolera widoku nadrzędnego.
Define Lazy properties:
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
}()
Pokaż/Ukryj Kontrolery Widoku Potomnego:
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()
}
Zarządzaj SegmentedControl tapEvent
private func updateView() {
if segmentedControl.selectedSegmentIndex == 0 {
remove(asChildViewController: sessionsViewController)
add(asChildViewController: summaryViewController)
} else {
remove(asChildViewController: summaryViewController)
add(asChildViewController: sessionsViewController)
}
}
I oczywiście możesz używać kontrolera widoku dziecka klasy:
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")
}
Odniesienie: https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-29 15:22:17
Szybka wersja Swift:
@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {
if segmentControl.selectedSegmentIndex == 0 {
// do something
} else {
// do something else
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 09:50:36