到目前为止,我还是无法想象如何在一个视图控制器中切换多个视图。我的故事板就像这样。
现在我想在我的视图控制器中嵌入两个视图。
我的分段控制代码到目前为止在一个视图控制器中切换两个视图。
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.
}
}
另一件事,如果我在控制器中放置两个视图,区分它的最佳做法是什么?
请指教。谢谢。
答案 0 :(得分:48)
如果你想在Xcode中为两个重叠的子视图进行UI布局,更好的解决方案是使用两个UIContainerViewController,并使用与上面答案中建议的隐藏属性相同的方法。
答案 1 :(得分:41)
您可以使用UIView
的{{3}}属性来显示/隐藏所需的观看次数。
首先,您必须通过“界面”构建器
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 :(得分:6)
首先创建两个出口并将软管连接到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,请为各个标记分配视图(说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;
}
}
答案 3 :(得分:1)
将两个视图添加到故事板中的视图控制器并将其中一个设置为隐藏= yes或alpha = 0.当您的索引更改函数被调用时,将屏幕上的当前视图设置为hidden = yes / alpha of 0并将之前隐藏的视图设置为hidden = no / alpha = 1.这应该达到你想要的效果。
答案 4 :(得分:0)
@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;
}
}
答案 5 :(得分:0)
如果它是一个简单的视图,而不是屏幕的一部分,则确实可以使用视图控制器视图的两个子视图的isHidden属性。但是我不喜欢这种方法,因为当所有子视图合而为一时,很难理解后者的动作。 我将以编程方式添加和删除这两个视图作为子视图控制器。我认为这是最干净的方法。 但是,即使您决定只使用视图,也不要将它们直接放在视图控制器的视图上。使用笔尖,最好与所有者类一起使用。并且在许多情况下,请考虑以编程方式添加和约束它们。它不仅是代码,而且更干净,并节省了资源。
答案 6 :(得分:0)
所以上面写的内容对我不起作用,所以我想出了自己在带有Swift 5的Xcode 11中的经验。 (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()
}
}
也许这可以帮助任何人。