【问题标题】:Toggle ViewController Views切换 ViewController 视图
【发布时间】:2017-02-20 20:37:27
【问题描述】:

我正在使用几个示例项目来学习 iOS。我有两个视图控制器,第一个 VC 有几个按钮和一个 mapview,第二个 VC 有 tableview 显示一组结果。我已将两个视图控制器都嵌入到 navigationViewController 中。通过单击 First VC 中的按钮,我能够显示 tableview(使用 show segue)并能够通过导航返回到第一个 VC。现在我的查询是我想显示 tableview(第二个 VC)来代替 firstVC 中定义的一个视图对象(地图视图),而不是完全全屏填充 tableview。我的问题是当显示另一个 Viewcontroller 时,我仍然希望看到来自 firstVC 的几个视图对象,所以当我单击触发 segue 的按钮时,我试图在 mapview 顶部显示 secondVC。我必须使用单一界面,所以我需要通过将 mapView 的视图替换为 tableview 来将 SecondVC 的 tablview 结果加载到 firstVC 中。如果可能的话,请告诉我您的想法,并且欢迎任何其他实现相同想法的想法。

【问题讨论】:

    标签: ios uiviewcontroller swift3 uistoryboardsegue uicontainerview


    【解决方案1】:

    斯里坎特·冈德拉帕利,

    您需要做的就是将 TableView 控制器的视图作为子视图添加到您的视图控制器。为了简化我个人更喜欢使用ContainerView的过程,

    第 1 步:将 ContainerView 添加到您的 View Controller 并为其添加自动布局约束,因为您的 tableView 将加载到此容器视图中,您必须将任何自动布局约束应用于您的 tableView 以使其保持原位: )

    例如:

    第 2 步:将 IBOutlet 拖到容器视图中。让我们将其称为 containerView :)

    第 3 步:现在由您决定是否拥有两个视图控制器 1 用于加载地图和 1 用于加载 tableView,或者您将地图视图作为视图控制器子视图,您将隐藏或删除它并添加容器视图但我个人更喜欢代码干净整洁,所以我更喜欢有两个不同的 VC

    所以让我们创建 2 个 VC,让我们将它们称为 viewController1 和 viewController2 Savy ??

    第 4 步: 让我们编写一个实际加载 VC 并将其视图作为子视图添加到您的 ViewController 的方法

    func changeEmbededVC(for status : Int) {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            if status == 0 {
                mehereButton.tag = 1
                let vc = storyboard.instantiateViewController(withIdentifier: "viewController1")
                vc.willMove(toParentViewController: self)
                containerView.addSubview(vc.view)
                self.addChildViewController(vc)
                vc.didMove(toParentViewController: self)
            }
            else {
                mehereButton.tag = 0
                let vc = storyboard.instantiateViewController(withIdentifier: "viewController2")
                vc.willMove(toParentViewController: self)
                containerView.addSubview(vc.view)
                self.addChildViewController(vc)
                vc.didMove(toParentViewController: self)
            }
    
        }
    

    我相信代码很容易解释:D 现在mehereButton.tag = 1 是什么?很简单,您想在按钮按下时切换视图,不是吗:D 因此我为 mehereButton 创建了一个 IBOutlet 并更改了它的标签:)

    现在终于在 mehereButton 的 IBAction 中

    @IBAction func buttonTapped(_ sender: UIButton) {
        self.changeEmbededVC(for: self.mehereButton.tag)
    }
    

    但我们需要默认加载其中一个视图,不是吗:D 所以将您的 viewDidAppear 更改为

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.changeEmbededVC(for: 0)
    }
    

    希望我详细回答了您的问题:P 我知道您既不能投票也不能接受答案,因为您没有足够的声誉 :) 但希望它将来也能对某人有所帮助:)

    【讨论】:

    • 首先,感谢您的回答。我被困在实现它,你能告诉我一些指导方针,如何在不单独使用两个视图控制器的情况下在按钮单击时使用 tableview 切换 mapview 的视图。
    • 您可以添加地图视图并对其应用自动布局约束,然后在 mapView 之上添加一个 tableView 并对其应用自动布局约束,然后有两个 IBOutlets 一个用于 tableView,一个用于 mapView 和在基于标签值的按钮单击中分别隐藏表格或地图视图:) 伙计们:)
    • Sandeep,感谢您的快速回复。我认为最好向您简要介绍我正在尝试实施的内容。就像我在我的第一个 VC 中所说的那样,我的视图对象很少,其中一个是 mapview。我有一个网络服务,我每次调用一个位置作为我给出的参数,它返回一些结果,这些结果是我用来进行注释并在地图中显示相同的位置集。因为我在我的 FirstVC 中有地图的出口,所以我可以参考它并做任何我想做的事情。如果我使用容器视图,那么我可以在其中加载子视图(mapView),但如何获取它的出口。
    • 仅供参考,我的地图视图中有相同的实现https://www.raywenderlich.com/90971/introduction-mapkit-swift-tutorial
    • 最后,能够使用您隐藏适当视图并显示另一个视图的想法来切换视图,反之亦然,根据您指示的按钮标签值。非常感谢 Sandeep :)。
    猜你喜欢
    • 2011-07-20
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多