Swift:呈现视图控制器时缺少标签栏 - 如何解决这个问题?

时间:2017-10-25 18:45:48

标签: ios swift viewcontroller tabbar

我在故事板中创建了一个包含三个视图的简单标签栏。标签栏效果很好,但是当我尝试通过选项卡中的按钮显示另一个视图控制器时,新视图将放置在整个屏幕上以及标签栏上。

这是我按下按钮时到目前为止呈现视图的方式:

@IBAction func buttonPressed(_ sender: UIButton) {

        let newVC = self.storyboard?.instantiateViewController(withIdentifier: "extraVC")
        self.present(newVC!, animated: true, completion: nil)
    }

我的另一个想法是:

        self.tabBarController?.present(vc!, animated: true, completion: nil)

但令我惊讶的是,这也不起作用。

那么如何在标签栏中显示另一个视图控制器(以便仍然显示底部栏)?

5 个答案:

答案 0 :(得分:13)

当您以模态方式呈现视图控制器时,其呈现样式将为"全屏"默认情况下。你要做的就是让它在这种情况下只是覆盖屏幕的一部分(绘制呈现视图控制器的部分。

实现这一目标的一种方法是:

  1. 呈现的视图控制器的modalPresentationStyle设置为.currentContext或.overCurrentContext

  2. 呈现模态的视图控制器中,将其definesContext属性设置为true。

  3. 这些步骤可以通过在segue和视图控制器上设置属性在Interface Builder中完成,或者您可以修改代码以包含以下内容:

    @IBAction func buttonPressed(_ sender: UIButton) {
        let newVC = self.storyboard?.instantiateViewController(withIdentifier: "extraVC")
        self.definesPresentationContext = true
        newVC?.modalPresentationStyle = .overCurrentContext
        self.present(newVC!, animated: true, completion: nil)
    }
    

    这些属性组合的作用是:

    1. 指明呈现的视图控制器,您希望它在非全屏上下文中显示(屏幕的某个特定部分)

    2. 表示呈现视图控制器是屏幕的一部分/您希望根据其绘制模态的上下文。

    3. 更多详情可在Apple Documentation

      中找到

答案 1 :(得分:1)

当您使用present方法时,ViewController以模态方式呈现并覆盖您的UITabBarConntroller。您可以将TabBar中的每个第一个视图控制器嵌入到UINavigationController中,然后使用方法pushViewController将其推入堆栈,而不是以模态方式显示视图。您将免费获得TabBar可见且美观的动画。

答案 2 :(得分:0)

在Xcode中,我使用Tabbed App模板创建了一个新项目来说明上面的解决方案。这将创建一个带有tabbar控制器和两个视图控制器的项目。我添加了一个标题为"查看页面的按钮"从故事板到第一个视图控制器并嵌入导航控制器。

enter image description here

在进行上述更改后,故事板将如下所示:

enter image description here

在FirstViewController.swift文件中,我使用以下代码为按钮创建了一个IBAction,它将创建另一个名为DetailViewController的视图控制器,标题为Favorites,背景颜色为橙色。我使用导航控制器通过将其推送到导航控制器堆栈来呈现它。

@IBAction func viewPageButtonTapped(_ sender: UIButton) {
    print("viewPageButtonTapped")
            let pinkViewController = DetailViewController()
    pinkViewController.title = "Favorites"
    pinkViewController.view.backgroundColor = UIColor.orange
    navigationController?.pushViewController(pinkViewController, animated: true)
}

当我在模拟器上运行项目时,我得到了所需的结果。希望这有助于您提供一些想法。

答案 3 :(得分:0)

您应该在主上下文中显示视图控制器,而不是模态地显示它。 为此,而不是:

@IBAction func buttonPressed(_ sender: UIButton) {
    let newVC = self.storyboard?.instantiateViewController(withIdentifier: "extraVC")
    self.present(newVC!, animated: true, completion: nil)
}

通话以显示:

@IBAction func buttonPressed(_ sender: UIButton) {
    let newVC = self.storyboard?.instantiateViewController(withIdentifier: "extraVC")
    self.show(newVC!, sender: self)
}

答案 4 :(得分:-1)

在viewController中执行:

self.tabBarController?.present(nextViewController, animated: true/false, completion: {})