【问题标题】:Change views using Segmented Control使用分段控制更改视图
【发布时间】:2018-07-11 17:38:15
【问题描述】:

我需要使用分段控件更改视图。在以下示例中,我将两个视图容器放置在同一位置:

第二个容器是隐藏的,我每次使用分段控件时都会通过代码显示出来。 (虽然它也没有显示出来。)

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var container1: UIView!
    @IBOutlet weak var container2: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func showComponent(_ sender: Any) {
        if (sender as AnyObject).selectedSegmentIndex == 0 {
            UIView.animate(withDuration: 0.5, animations: {
                self.container1.alpha = 1
                self.container2.alpha = 0
            })
        } else {
            UIView.animate(withDuration: 0.5, animations: {
                self.container1.alpha = 0
                self.container2.alpha = 1
            })
        }
    }

}

你知道其他方法吗?

有什么方法可以自定义 SegmentedControl 就好像它是一个 TAB 一样?

【问题讨论】:

  • 你只是想隐藏和显示容器。
  • 只使用单个 containerView 并根据 segmentControl 索引添加 childViewController 或删除 childViewController

标签: ios swift ios11 swift4 xcode9


【解决方案1】:
  1. 如果你能给我一个项目,那就太好了。但是,如果您可以尝试执行后续步骤,则可能不需要它。

  2. 我会采取不同的方式。在您的 VC 中添加 UIView。称之为容器视图。然后在 xib (nib) 中创建 2 个单独的视图更多 herehere。然后将这两个视图添加到容器视图中: view.addSubsire(view1)view.addSubsire(view2)

  3. 然后正如您所做的那样,检查分段控件并显示您需要的视图。

  4. 不要忘记 UI 调试。使用这个惊人的功能:link

实施可能需要一些时间,但这些是您在任何情况下都需要了解的基础知识,因此它肯定会很有用。

希望对您有所帮助!祝你好运!

PS。上面发布的答案 - 不确定是否有帮助,因为您需要标签为半页?

【讨论】:

  • 这是我想过的解决方案,但我想避免创建 .xip 文件
  • 知道了!如果这很容易解释,您能分享一下您为什么要避免它吗?
  • 例如我喜欢使用它,因为它可以重复使用。
【解决方案2】:

在这里,我根据您的要求创建了一个完整的解决方案。

斯威夫特 4

//
//  SegementedVC.swift
//
//  Created by Test User on 01/02/18.
//  Copyright © 2018 Test User. All rights reserved.
//

import UIKit

class SegementedVC: UIViewController {

    //----------------------------------------------------------------
    // MARK:-
    // MARK:- Outlets
    //----------------------------------------------------------------

    @IBOutlet weak var segmentControl   : UISegmentedControl!
    @IBOutlet weak var containerView    : UIView!


    //----------------------------------------------------------------
    // MARK:-
    // MARK:- Variables
    //----------------------------------------------------------------

    private lazy var firstViewController: FirstViewController = {
        // Load Storyboard
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

        // Instantiate View Controller
        var viewController = storyboard.instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController

        // Add View Controller as Child View Controller
        self.add(asChildViewController: viewController)

        return viewController
    }()

    private lazy var secondViewController: SecondViewController = {
        // Load Storyboard
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

        // Instantiate View Controller
        var viewController = storyboard.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController

        // Add View Controller as Child View Controller
        self.add(asChildViewController: viewController)

        return viewController
    }()


    //----------------------------------------------------------------
    // MARK:-
    // MARK:- Abstract Method
    //----------------------------------------------------------------

    static func viewController() -> SegementedVC {
        return UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SegementedView") as! SegementedVC
    }

    //----------------------------------------------------------------
    // MARK:-
    // MARK:- Memory Management Methods
    //----------------------------------------------------------------

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    //----------------------------------------------------------------
    // MARK:-
    // MARK:- Action Methods
    //----------------------------------------------------------------

    @IBAction func segmentValueChanged(_ sender: UISegmentedControl) {
        updateView()
    }


    //----------------------------------------------------------------
    // MARK:-
    // MARK:- Custom Methods
    //----------------------------------------------------------------

    private func add(asChildViewController viewController: UIViewController) {

        // Add Child View Controller
        addChildViewController(viewController)

        // Add Child View as Subview
        containerView.addSubview(viewController.view)

        // Configure Child View
        viewController.view.frame = containerView.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()
    }

    //----------------------------------------------------------------

    private func updateView() {
        if segmentControl.selectedSegmentIndex == 0 {
            remove(asChildViewController: secondViewController)
            add(asChildViewController: firstViewController)
        } else {
            remove(asChildViewController: firstViewController)
            add(asChildViewController: secondViewController)
        }
    }

    //----------------------------------------------------------------

    func setupView() {
        updateView()
    }



    //----------------------------------------------------------------
    // MARK:-
    // MARK:- View Life Cycle Methods
    //----------------------------------------------------------------

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setupView()
    }

    //----------------------------------------------------------------

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }

    //----------------------------------------------------------------

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }
}

故事板屏幕截图

【讨论】:

  • 您认为可以将代码发送到我的邮箱吗? jlsc92@gmail.com
  • 当然,您可以使用此链接下载整个工作演示:dropbox.com/s/cd2c7tmseoh9lp4/…
  • 这很完美。我唯一的问题是,如果我向段控件添加约束以占据整个宽度,控件就会被隐藏。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
相关资源
最近更新 更多