ios - 在同一个标签栏项目上加载新的 viewController 不起作用
问题描述
所以我在同一个标签栏项目上加载新的视图控制器时遇到问题。我有一个标签栏控制器作为我的根控制器,标签栏上有 4 个标签。其中之一是帐户选项卡,当用户登录时,他需要查看其帐户详细信息的概述,但是当没有用户时,该选项卡栏项目上需要有一个登录/登录页面。目前,我有一个用于我的 tabbarcontroller 的自定义选项卡栏类,它具有我认为是解决方案但没有任何反应的功能。我在需要加载的视图控制器(用户详细信息页面)中放置了一个断点,它出现在 ViewDidLoad 中,因此它加载但它没有出现在屏幕上。
希望我终于可以解决这个问题!
亲切的问候 B.
这是我的自定义标签栏控制器类:
import UIKit
class TabBarViewController: UITabBarController, UITabBarControllerDelegate {
var window: UIWindow?
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
func tabBarController(_ tabBarController: UITabBarController,
shouldSelect viewController: UIViewController) -> Bool{
let frame = UIScreen.main.bounds
window = UIWindow(frame: frame)
let index = tabBarController.viewControllers?.firstIndex(of: viewController)
if index == 3{ // Index of Account tab
let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let loginVC = mainStoryBoard.instantiateViewController(withIdentifier: "MessagesViewController") as! MessagesViewController
window?.rootViewController = loginVC
window?.makeKeyAndVisible()
}
return true// you decide
}
}
解决方案
这是呈现全屏 loginVc 的代码
func tabBarController(_ tabBarController: UITabBarController,
shouldSelect viewController: UIViewController) -> Bool{
let frame = UIScreen.main.bounds
window = UIWindow(frame: frame)
let index = tabBarController.viewControllers?.firstIndex(of: viewController)
if index == 1{ // Index of Account tab
let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let loginVC = mainStoryBoard.instantiateViewController(withIdentifier: "MessagesViewController") as! MessagesViewController
loginVC.modalPresentationStyle = .fullScreen
self.present(loginVC, animated: false, completion: nil)
}
return true// you decide
}
如果你还想有底栏......你的那个viewController应该是Navigation Controller,你可以推送你想要的ViewController然后喜欢
func tabBarController(_ tabBarController: UITabBarController,
shouldSelect viewController: UIViewController) -> Bool{
let frame = UIScreen.main.bounds
window = UIWindow(frame: frame)
let index = tabBarController.viewControllers?.firstIndex(of: viewController)
if index == 1{ // Index of Account tab
let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let loginVC = mainStoryBoard.instantiateViewController(withIdentifier: "MessagesViewController") as! MessagesViewController
// loginVC.modalPresentationStyle = .fullScreen
if let navigation = viewController as? UINavigationController {
navigation.pushViewController(loginVC, animated: false)
}
}
return true// you decide
}
MessagesViewController
如果您不想要 NavigationBar 然后在您的加载函数调用中,它将在顶部显示返回按钮和导航栏
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.isNavigationBarHidden = true
// Do any additional setup after loading the view.
}
如果您只想隐藏后退按钮,请致电
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.setHidesBackButton(true, animated: false);
// Do any additional setup after loading the view.
}
推荐阅读
- reactjs - 收音机,无法读取 null 的属性“focusVisible”
- javascript - 我可以获取“req.session”(快速会话)数据吗?
- json - Laravel API 传递给 Vuejs 查询连接嵌套事务和订单 Ttbles
- c++ - -> if (c++) 中的运算符
- docker - 如何从自动化套件运行 Dockerfile 或 docker-compose 文件
- javascript - 获取数组中的最后一个索引号 [JavaScript]
- python - 在 python3 中使用置换循环形成新数组
- node.js - 当有嵌套的 package.json 文件时,Babel 不会编译文件
- python - `pip list --outdated` 没有列出 pip 本身
- sql-server - invoke-sqlcmd 失败在某些类型的查询上显示没有结果