gpt4 book ai didi

ios - 在另一个 ViewController 中显示和切换 ViewController

转载 作者:搜寻专家 更新时间:2023-11-01 06:55:08 25 4
gpt4 key购买 nike

我基本上是在尝试创建一个自定义的 UITabBarController,因为我需要一些特定的功能。 TabBar 本身已完成并可以正常工作,但我不太清楚如何在此 CustomTabBarViewController 本身中显示 ViewController。

假设我有以下方法:

func tabSelected(_ index: Int) {}

并且通过tabbar.frame.size 知道我的TabBar 的高度,我如何在TabBar 上方实例化两个ViewController 并在调用tabSelected 方法时在它们之间切换?过渡动画会更好,但不是必需的。

注意:我的 TabBar 不继承自 UITabBarController,仅继承自常规 UIViewController,以避免进一步混淆。

最佳答案

我在这里创建了示例项目: CustomTabBarViewController


  • 您应该为子 ViewController 提供容器 View
  • 那么你应该有嵌入 ViewControllers 的数组
  • 你应该调用方法CustomTabBarViewController 改变里面的 ViewController从索引处的 VC 数组到 ViewController 的容器 View ,您将其作为此方法的参数传递

首先为您的 TabBar 按钮声明 socket 集合,并获取将显示您的 ViewController 的容器 View 的引用

@IBOutlet var tabBarButtons: [UIButton]!
@IBOutlet weak var container: UIView!

然后为你的标签栏项目创建数组

var items: [UIViewController]?

接下来为您的 Controller 创建惰性变量

private lazy var aVC: A = {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "a") as! A
}()

private lazy var bVC: B = {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "b") as! B
}()

.... 这可以通过创建根据 VC 的标识符返回 ViewController 的方法来简化

之后,将 ViewControllers 附加到您的 items 数组,并将每个添加为 TabBarViewController 的 child

override func viewDidLoad() {
super.viewDidLoad()
items = [aVC, bVC]
items!.forEach { addChild($0) }
}

继续声明设置ViewController的方法

private func setViewController(_ viewController: UIViewController) {
items!.forEach { $0.view.removeFromSuperview(); $0.willMove(toParent: nil) }
container.addSubview(viewController.view)
viewController.view.frame = container.bounds
viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
viewController.didMove(toParent: self)
}

现在为您的标签栏按钮添加操作并获取按钮索引。然后使用此索引调用您的 tabSelected 方法

@IBAction func buttonPressed(_ sender: UIButton) {
if let index = tabBarButtons.index(of: sender) {
tabSelected(index)
}
}

tabSelected 中根据发送者标签栏按钮的索引从 items 设置 VC

func tabSelected(_ index: Int) {
if let item = items?[index] {
setViewController(item)
}
}

最后在 viewDidLoad 中设置第一项

override func viewDidLoad() {
...
tabSelected(0)
}

现在您可以完全自定义您的 ViewController 并制作您从 UITabBarController 中了解到的其他史诗般的东西

关于ios - 在另一个 ViewController 中显示和切换 ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53960530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com