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

Posted

技术标签:

【中文标题】Swift - 分段控制 - 切换多个视图【英文标题】:Swift - Segmented control - Switch multiple views 【发布时间】:2015-01-15 03:26:55 【问题描述】:

直到现在我仍然不知道如何在一个视图控制器中切换多个视图。我的故事板是这样的。

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

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

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.
    



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

【问题讨论】:

【参考方案1】:

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

【讨论】:

@IBAction func segmentSelectedAction(sender: AnyObject) switch sender.selectedSegmentIndex case 0 : firstContainer.hidden = false secodeContainer.hidden = true case 1: firstContainer.hidden = true secodeContainer.hidden = false default: break; 问题:如何将容器视图链接到 2 视图控制器?我希望链接到 1 个容器视图和 2 个表视图。我不知何故只能链接到故事板中的 1 个表格视图。 这种方法和接受的答案有什么区别? @vichhai。我在我的案例中使用了这个解决方案。但是,我的子控制器中有无响应的导航栏按钮项。 ***.com/questions/40101381/… 这应该是答案【参考方案2】:

您可以使用UIViewisHidden 属性来显示/隐藏您需要的视图。 首先,您必须通过 Interface builder 将两个视图链接到 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

【讨论】:

嘿,你是如何在情节提要中实际做到这一点的?你如何将 historyView 放在 PopularView 上? 需要在每个案例结束时添加中断【参考方案3】:

首先创建两个出口并将软管连接到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; 
    

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:
@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;
    

【讨论】:

【参考方案7】:

所以上面写的内容对我不起作用,所以我在 Xcode 11 和 Swift 5 中找到了自己。 (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()
        
    

也许这对任何人都有帮助。

【讨论】:

你是怎么在方法里面写方法的? :o

以上是关于Swift - 分段控制 - 切换多个视图的主要内容,如果未能解决你的问题,请参考以下文章

使用分段控制在 ios 中的视图之间切换视图

使用单个按钮 Xcode 或 swift 切换视图控制器的背景颜色

无法在 swift ui 中单击分段选择器

在 Swift 中单击以编程方式切换到 TableViewCell 上的导航视图

如果在 Parse 中找到,则输入邮政编码切换视图控制器(Swift 和 XCode)

使用带有 2 个可切换视图和一个分段控件的导航