Swift - 分段控制 - 切换多个视图

时间:2015-01-15 03:26:56

标签: ios swift xcode6

到目前为止,我还是无法想象如何在一个视图控制器中切换多个视图。我的故事板就像这样。

enter image description here

现在我想在我的视图控制器中嵌入两个视图。

enter image description here

我的分段控制代码到目前为止在一个视图控制器中切换两个视图。

import UIKit

class PopularHistoryViewController: UIViewController {

    @IBOutlet weak var segmentedControl: UISegmentedControl!

    @IBAction func indexChanged(sender: UISegmentedControl) {
        switch segmentedControl.selectedSegmentIndex
        {
        case 0:
            NSLog("Popular selected")
            //show popular view
        case 1:
            NSLog("History selected")
            //show history view
        default:
            break; 
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }


}

另一件事,如果我在控制器中放置两个视图,区分它的最佳做法是什么?

请指教。谢谢。

7 个答案:

答案 0 :(得分:48)

如果你想在Xcode中为两个重叠的子视图进行UI布局,更好的解决方案是使用两个UIContainerViewController,并使用与上面答案中建议的隐藏属性相同的方法。

enter image description here

答案 1 :(得分:41)

您可以使用UIView的{​​{3}}属性来显示/隐藏所需的观看次数。 首先,您必须通过“界面”构建器

将两个视图链接到IBOutlets
@IBOutlet weak var historyView: UIView!
@IBOutlet weak var popularView: UIView!

@IBAction func indexChanged(_ sender: UISegmentedControl) {
    switch segmentedControl.selectedSegmentIndex {
    case 0:
        historyView.isHidden = true
        popularView.isHidden = false
    case 1:
        historyView.isHidden = false
        popularView.isHidden = true
    default:
        break;
    }
}

注意:它在Swift 1和2中被命名为hidden

答案 2 :(得分:6)

首先创建两个出口并将软管连接到ViewController中的视图。

@IBOutlet weak var firstView: UIView!
@IBOutlet weak var secondView: UIView!

并更改代码:

@IBAction func indexChanged(sender: UISegmentedControl)
{
    switch segmentedControl.selectedSegmentIndex
    {
    case 0:
        firstView.hidden = false
        secondView.hidden = true
    case 1:
        firstView.hidden = true
        secondView.hidden = false
    default:
        break; 
    }
}

如果您不想创建Outlets,请为各个标记分配视图(说101102),您可以这样做:

@IBAction func indexChanged(sender: UISegmentedControl)
{
    switch segmentedControl.selectedSegmentIndex
    {
    case 0:
        self.view.viewWithTag(101)?.hidden = false
        self.view.viewWithTag(102)?.hidden = true
    case 1:
        self.view.viewWithTag(101)?.hidden = true
        self.view.viewWithTag(102)?.hidden = false
    default:
        break; 
    }
}

答案 3 :(得分:1)

将两个视图添加到故事板中的视图控制器并将其中一个设置为隐藏= yes或alpha = 0.当您的索引更改函数被调用时,将屏幕上的当前视图设置为hidden = yes / alpha of 0并将之前隐藏的视图设置为hidden = no / alpha = 1.这应该达到你想要的效果。

答案 4 :(得分:0)

@IBAction func acSegmentAction(_ sender:Any){

    switch acSegmentedControl.selectedSegmentIndex
    {
    case 0:
       // print("addressview selected")

        addressView.isHidden = false
        contactProviderView.isHidden = true
    case 1:
        //print("contact provider selected")

        addressView.isHidden = true
        contactProviderView.isHidden = false
    default:
        break;
    }

    }

答案 5 :(得分:0)

如果它是一个简单的视图,而不是屏幕的一部分,则确实可以使用视图控制器视图的两个子视图的isHidden属性。但是我不喜欢这种方法,因为当所有子视图合而为一时,很难理解后者的动作。 我将以编程方式添加和删除这两个视图作为子视图控制器。我认为这是最干净的方法。 但是,即使您决定只使用视图,也不要将它们直接放在视图控制器的视图上。使用笔尖,最好与所有者类一起使用。并且在许多情况下,请考虑以编程方式添加和约束它们。它不仅是代码,而且更干净,并节省了资源。

答案 6 :(得分:0)

所以上面写的内容对我不起作用,所以我想出了自己在带有Swift 5的Xcode 11中的经验。 (view1 = historyView,view2 = PopularView)

@IBOutlet weak var view1: UITableView!
@IBOutlet weak var view2: UITableView!

@IBAction func segmentedControlChanged(_ sender: Any) {

    func showView1() {
        view1.isHidden = false
        view2.isHidden = true
    }

    func showView2() {
        view1.isHidden = true
        view2.isHidden = false
    }

    guard let segmentedControl = sender as?
        UISegmentedControl else { return }
    if segmentedControl.selectedSegmentIndex == 0 {
        showView1()

    }
        else {
            showView2()
        }
    }

也许这可以帮助任何人。