簡體   English   中英

Swift - 如何將兩個視圖控制器鏈接到一個容器視圖中並使用分段控件在它們之間切換?

[英]Swift - How to link two view controllers into one container view and switch between them using segmented control?

我有一個包含 1 個分段控件和 2 個 UI 視圖的視圖控制器。 但我認為更新 UI 視圖以進行增強以供將來編輯太復雜了。 我正在使用隱藏方法。

import UIKit

class PopularHistoryViewController: UIViewController {


    @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var popularView: UIView!
    @IBOutlet weak var historyView: UIView!

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

    override func viewDidLoad() {
        super.viewDidLoad()

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

}

我想要的是包含 2 個控制器視圖的 1 個容器視圖,因此我可以使用分段控制來切換它們。

在此處輸入圖片說明

另一種方法是一次在內存中只有一個子視圖控制器,然后在更改分段控件中的選定值時,加載新的子視圖控制器,在一個子視圖控制器之間轉換到下一個,然后刪除舊的子視圖控制器:

let viewControllerIdentifiers = ["first", "second"]  // storyboard identifiers for the child view controllers

@IBAction func didChangeValue(sender: UISegmentedControl) {
    let newController = storyboard!.instantiateViewController(withIdentifier: viewControllerIdentifiers[sender.selectedSegmentIndex])
    let oldController = childViewControllers.last!

    oldController.willMove(toParentViewController: nil)
    addChildViewController(newController)
    newController.view.frame = oldController.view.frame

    transition(from: oldController, to: newController, duration: 0.25, options: .transitionCrossDissolve, animations: {
        // nothing needed here
    }, completion: { _ -> Void in
        oldController.removeFromParentViewController()
        newController.didMove(toParentViewController: self)
    })
}

顯然,這假設您已經在視圖上獲得了第一個子視圖控制器(如果您使用 Interface Builder 中的“容器視圖”控件很容易完成)並且UISegmentedControl的默認選擇值匹配。 您還必須擁有這兩個子場景的故事板標識符。

對於 Swift 2 版本,請參閱此答案的先前修訂版

不久前,我曾廣泛嘗試這樣做。 由於某種原因,隱藏的屬性對我不起作用,並且容器視圖似乎沒有更新。 我知道這不是理想的解決方案,但我最終創建了兩個容器視圖並使用分段控件來更改容器視圖的 alpha。 同樣,不理想,但效果很好。

import UIKit

class ContactsView: UIViewController {

    @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var privateView: UIView!
    @IBOutlet weak var publicView: UIView!

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

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM