今まで、1つのView Controllerで複数のビューを切り替える方法を理解できませんでした。私の絵コンテはこのようなものです。
現時点では、View Controller内に2つのビューを埋め込みたいと思います。
これまでの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つのビューを配置した場合、それを区別するためのベストプラクティスは何ですか?
ご意見をお聞かせください。ありがとうございました。
isHidden
の UIView
プロパティを使用して、必要なビューを表示/非表示できます。最初に、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
という名前が付けられました。
重複する2つのサブビューに対してXcodeでUIレイアウトを行いたい場合、2つのUIContainerViewControllerを使用し、上記の回答で提案したのと同じ方法で非表示プロパティを設定することをお勧めします。
まず、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;
}
}
両方のビューをストーリーボードのビューコントローラーに追加し、それらのいずれかを非表示= yesまたはalpha = 0に設定します。インデックス変更関数が呼び出されたら、画面上の現在のビューをhidden = yes/alphaの0に設定し、以前は非表示だったビューを非表示= no/alpha = 1にします。これにより、目的を達成できます。
画面の一部ではなく単純なビューである場合、View Controllerビューの2つのサブビューのisHiddenプロパティを実際に使用できます。しかし、すべてのサブビューが1つのパイルにある場合に、ペン先で何が起こっているのかを理解するのが難しいため、このアプローチは好きではありません。これらの2つのビューをプログラムで子View Controllerとして追加および削除します。私の意見では、これが最もクリーンな方法です。ただし、ビューのみを使用する場合でも、View Controllerのビューに直接配置しないでください。できればオーナークラスのペン先を使用してください。また、多くの場合、それらをプログラムで追加および制限することを検討してください。コードは増えますが、クリーンでリソースを節約できます。
@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;
}
}