【问题标题】:Swift - Segmented control - Switch multiple viewsSwift - 分段控制 - 切换多个视图
【发布时间】: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.
    }


}

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

【问题讨论】:

    标签: ios swift xcode6


    【解决方案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。我在我的案例中使用了这个解决方案。但是,我的子控制器中有无响应的导航栏按钮项。 stackoverflow.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
            猜你喜欢
            • 2015-04-20
            • 1970-01-01
            • 1970-01-01
            • 2014-01-01
            • 2021-07-26
            • 1970-01-01
            • 1970-01-01
            • 2015-07-24
            • 2015-08-06
            相关资源
            最近更新 更多