web-dev-qa-db-ja.com

Swift-セグメント化されたコントロール-複数のビューの切り替え

今まで、1つのView Controllerで複数のビューを切り替える方法を理解できませんでした。私の絵コンテはこのようなものです。

enter image description here

現時点では、View Controller内に2つのビューを埋め込みたいと思います。

enter image description here

これまでの1つのView Controllerで2つのビューを切り替えるためのセグメント化されたコントロールのコード。

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つ、コントローラー内に2つのビューを配置した場合、それを区別するためのベストプラクティスは何ですか?

ご意見をお聞かせください。ありがとうございました。

48
Mohammad Nurdin

isHiddenUIView プロパティを使用して、必要なビューを表示/非表示できます。最初に、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という名前が付けられました。

41
rakeshbs

重複する2つのサブビューに対してXcodeでUIレイアウトを行いたい場合、2つのUIContainerViewControllerを使用し、上記の回答で提案したのと同じ方法で非表示プロパティを設定することをお勧めします。

enter image description here

49
Xiaojun

まず、2つのアウトレットを作成し、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; 
    }
}

アウトレットを作成したくない場合は、ビューに個々のタグを割り当て(101および102と言う)、次のようにできます。

@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; 
    }
}
6
Midhun MP

両方のビューをストーリーボードのビューコントローラーに追加し、それらのいずれかを非表示= yesまたはalpha = 0に設定します。インデックス変更関数が呼び出されたら、画面上の現在のビューをhidden = yes/alphaの0に設定し、以前は非表示だったビューを非表示= no/alpha = 1にします。これにより、目的を達成できます。

1
Pete42

画面の一部ではなく単純なビューである場合、View Controllerビューの2つのサブビューのisHiddenプロパティを実際に使用できます。しかし、すべてのサブビューが1つのパイルにある場合に、ペン先で何が起こっているのかを理解するのが難しいため、このアプローチは好きではありません。これらの2つのビューをプログラムで子View Controllerとして追加および削除します。私の意見では、これが最もクリーンな方法です。ただし、ビューのみを使用する場合でも、View Controllerのビューに直接配置しないでください。できればオーナークラスのペン先を使用してください。また、多くの場合、それらをプログラムで追加および制限することを検討してください。コードは増えますが、クリーンでリソースを節約できます。

0
RealNmae

@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;
    }

    }
0
Sai kumar Reddy