Swift - 分段控制 - 切换多个视图
Posted
技术标签:
【中文标题】Swift - 分段控制 - 切换多个视图【英文标题】:Swift - Segmented control - Switch multiple views 【发布时间】:2015-01-15 03:26:55 【问题描述】:直到现在我仍然不知道如何在一个视图控制器中切换多个视图。我的故事板是这样的。
现在我想在我的视图控制器中嵌入两个视图。
到目前为止,我的分段控制代码可以在一个视图控制器中切换两个视图。
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】:如果你想在 Xcode 中为两个重叠的子视图做 UI 布局,更好的解决方案是使用两个 UIContainerViewController,并使用与上述答案中建议的设置隐藏属性相同的方式。
【讨论】:
@IBAction func segmentSelectedAction(sender: AnyObject) switch sender.selectedSegmentIndex case 0 : firstContainer.hidden = false secodeContainer.hidden = true case 1: firstContainer.hidden = true secodeContainer.hidden = false default: break;
问题:如何将容器视图链接到 2 视图控制器?我希望链接到 1 个容器视图和 2 个表视图。我不知何故只能链接到故事板中的 1 个表格视图。
这种方法和接受的答案有什么区别?
@vichhai。我在我的案例中使用了这个解决方案。但是,我的子控制器中有无响应的导航栏按钮项。 ***.com/questions/40101381/…
这应该是答案【参考方案2】:
您可以使用UIView
的isHidden
属性来显示/隐藏您需要的视图。
首先,您必须通过 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
。
【讨论】:
嘿,你是如何在情节提要中实际做到这一点的?你如何将 historyView 放在 PopularView 上? 需要在每个案例结束时添加中断【参考方案3】:首先创建两个出口并将软管连接到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;
【讨论】:
【参考方案4】:将两个视图添加到故事板中的视图控制器,并将其中一个设置为隐藏 = 是或 alpha = 0。当您的索引更改函数被调用时,将屏幕上的当前视图设置为隐藏 = 是/alpha 为 0并将之前隐藏的视图设置为 hidden = no/alpha = 1。这应该可以实现您想要的。
【讨论】:
【参考方案5】:如果它是一个简单的视图,而不是屏幕的一部分,你确实可以使用你的视图控制器视图的两个子视图的 isHidden 属性。但我不喜欢这种方法,因为当所有子视图都放在一堆时,很难理解你的 nib 发生了什么。 我将以编程方式将这两个视图作为子视图控制器添加和删除。在我看来,这是最干净的方式。 但即使你决定只使用视图,也不要将它们直接放在视图控制器的视图上。使用笔尖,最好使用所有者类。在许多情况下,考虑以编程方式添加和约束它们。它的代码更多,但也更清洁并节省资源。
【讨论】:
【参考方案6】:@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;
【讨论】:
【参考方案7】:所以上面写的内容对我不起作用,所以我在 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()
也许这对任何人都有帮助。
【讨论】:
你是怎么在方法里面写方法的? :o以上是关于Swift - 分段控制 - 切换多个视图的主要内容,如果未能解决你的问题,请参考以下文章
使用单个按钮 Xcode 或 swift 切换视图控制器的背景颜色
在 Swift 中单击以编程方式切换到 TableViewCell 上的导航视图