Swift - 分段控制 - 切换多个视图
Swift - Segmented control - Switch multiple views
直到现在我还是不知道如何在一个视图控制器中切换多个视图。我的故事板是这样的。
现在我想在我的视图控制器中嵌入两个视图。
目前为止,我的分段控制代码可以在一个视图控制器中切换两个视图。
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.
}
}
另一件事,如果我在我的控制器中放置两个视图,区分它的最佳做法是什么?
将两个视图添加到故事板中的视图控制器,并将其中一个设置为隐藏 = 是或 alpha = 0。调用索引更改函数时,将屏幕上的当前视图设置为隐藏 = yes/alpha 的 0 并将先前隐藏的视图设置为 hidden = no/alpha = 1。这应该实现你想要的。
您可以使用 isHidden
属性 的 UIView
来 show/hide 您所需的观看次数。
首先,您必须通过界面生成器 link 将两个视图 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
。
首先创建两个出口并将软管连接到 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;
}
}
如果想在Xcode中对重叠的两个subview进行UI布局,更好的解决方案是使用两个UIContainerViewController,并使用相同的方式设置已隐藏 属性,如上述答案中所建议。
@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;
}
}
如果它是一个简单的视图,而不是屏幕的一部分,您确实可以使用视图控制器视图的两个子视图的 isHidden 属性。但我不喜欢这种方法,因为当所有子视图都在一堆时,很难理解你的笔尖发生了什么。
我会以编程方式添加和删除这两个视图作为子视图控制器。在我看来,这是最干净的方式。
但是即使你决定只使用视图,也不要将它们直接放在视图控制器的视图上。使用笔尖,最好与所有者 class 一起使用。在许多情况下,考虑以编程方式添加和约束它们。它的代码更多,但也更干净并节省资源。
所以上面写的对我不起作用,所以我在Xcode 11和Swift 5中想出了自己。
(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()
}
}
也许这对任何人都有帮助。
直到现在我还是不知道如何在一个视图控制器中切换多个视图。我的故事板是这样的。
现在我想在我的视图控制器中嵌入两个视图。
目前为止,我的分段控制代码可以在一个视图控制器中切换两个视图。
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.
}
}
另一件事,如果我在我的控制器中放置两个视图,区分它的最佳做法是什么?
将两个视图添加到故事板中的视图控制器,并将其中一个设置为隐藏 = 是或 alpha = 0。调用索引更改函数时,将屏幕上的当前视图设置为隐藏 = yes/alpha 的 0 并将先前隐藏的视图设置为 hidden = no/alpha = 1。这应该实现你想要的。
您可以使用 isHidden
属性 的 UIView
来 show/hide 您所需的观看次数。
首先,您必须通过界面生成器 link 将两个视图 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
。
首先创建两个出口并将软管连接到 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;
}
}
如果想在Xcode中对重叠的两个subview进行UI布局,更好的解决方案是使用两个UIContainerViewController,并使用相同的方式设置已隐藏 属性,如上述答案中所建议。
@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;
}
}
如果它是一个简单的视图,而不是屏幕的一部分,您确实可以使用视图控制器视图的两个子视图的 isHidden 属性。但我不喜欢这种方法,因为当所有子视图都在一堆时,很难理解你的笔尖发生了什么。 我会以编程方式添加和删除这两个视图作为子视图控制器。在我看来,这是最干净的方式。 但是即使你决定只使用视图,也不要将它们直接放在视图控制器的视图上。使用笔尖,最好与所有者 class 一起使用。在许多情况下,考虑以编程方式添加和约束它们。它的代码更多,但也更干净并节省资源。
所以上面写的对我不起作用,所以我在Xcode 11和Swift 5中想出了自己。 (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()
}
}
也许这对任何人都有帮助。