代码之家  ›  专栏  ›  技术社区  ›  Mark Adams

如何使用uiSegmentedControl切换视图?

  •  80
  • Mark Adams  · 技术社区  · 15 年前

    我正在努力研究如何使用uisegmentedcontrol的不同状态切换视图,类似于苹果在应用程序商店中在“最高付费”和“最高免费”之间切换的方式。

    10 回复  |  直到 6 年前
        1
  •  111
  •   Ronnie Liew    15 年前

    最简单的方法是有两个视图,您可以切换它们的可见性,以指示已选择了哪个视图。下面是一些关于如何完成的示例代码,绝对不是处理视图的优化方法,而是演示如何使用 ui段控制 要切换可见视图:

    - (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
  •  45
  •   Marc M    14 年前

    在我的例子中,我的视图非常复杂,我不能仅仅更改不同视图的隐藏属性,因为它会占用太多的内存。

    我尝试过几种解决方案,但其中没有一种对我有用,或者表现得不稳定,特别是在导航栏的标题视图中,在推/弹出视图时不总是显示分段控制。

    我发现了这个关于这个问题的博客文章,它解释了如何以正确的方式进行。看来他在2010年世界野生动物保护委员会的苹果工程师的帮助下找到了这个解决方案。

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

    这个链接中的解决方案是我迄今为止找到的关于这个问题的最佳解决方案。只要稍微调整一下,它就可以用底部的制表符正常工作。

        3
  •  17
  •   lostInTransit    15 年前

    或者,如果它是一个表,则可以重新加载该表,并在cellForRowatindex中,根据所选的段选项从不同的数据源填充该表。

        4
  •  7
  •   Kendall Helmstetter Gelner    15 年前

    一个想法是让具有分段控件的视图具有一个容器视图,您可以用不同的子视图填充该视图(在切换段时添加为容器视图的唯一子视图)。你甚至可以为这些子视图设置单独的视图控制器,但是如果你需要的话,你必须向前推进一些重要的方法,比如“viewwillappear”和“view will消失”(如果你需要的话,必须告诉他们他们在哪个导航控制器下)。

    一般来说,这很好地工作,因为您可以在ib中使用容器布局主视图,子视图将填充容器所允许的任何空间(确保正确设置了自动调整大小的遮罩)。

        5
  •  7
  •   Soniya    12 年前

    尝试此代码,这将帮助您在更改段控件段的不同视图之间切换

    Open Different Views on selecting different segments of UISegmentControl

        6
  •  3
  •   sethfri Max O    11 年前

    试用使用 SNFSegmentedViewController ,一个开放源码组件,它使用类似的安装程序执行您所需的操作。 UITabBarController .

        7
  •  2
  •   Envil    10 年前

    根据@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
    
        8
  •  2
  •   Anbu.Karthik    8 年前

    赋值

     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];
     }
    } 
    
        9
  •  2
  •   SlavisaPetkovic    6 年前

    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/

        10
  •  1
  •   Bright    8 年前

    快速版本:

    @IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {
    
        if segmentControl.selectedSegmentIndex == 0 {
    
            // do something
        } else {
    
            // do something else
        }
    }