[英]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.