Abe*_*eri 1 uitabbarcontroller uinavigationcontroller swift
我有一个UITabBarController带有3个标签的SettingsVC,您可以在其中选择外观MainVC(ViewControllers根据用户的喜好,有2种不同的外观应显示为MainVC)。
我制作了该应用程序,并且可以正常工作,但是它确实有问题,因为我只是相互推挤ViewControllers,在某些情况下,切换时会看到错误tabs。
主板
这是我的代码的一部分(尝试了很多东西之后),该代码根据以下内容更改了VC UserDefaults
CheckSettingsStatus.swift
//
// Check for Double Column Settings and navigate to Double Column VC
//
func checkMainVCViewStatusAndNavigateAcordingly(){
if UserDefaults.standard.integer(forKey: KEY_MAIN_VC_VIEW) == 1{
//let appDel = UIApplication.shared.delegate as! AppDelegate
//appDel.goToDoubleMainVC()
let mainVC = storyboard?.instantiateViewController(withIdentifier: "DoubleColumnMainVC") as! DoubleColumnMainVC
self.navigationController?.viewControllers[0] = mainVC
//navigationController?.pushViewController(mainVC, animated: false)
var navigationArray = self.navigationController?.viewControllers
print("Number of VCs = \(String(describing: navigationArray?.count))")
if navigationArray?.count == nil{
self.navigationController?.pushViewController(mainVC, animated: false)
}else{
self.navigationController?.popToRootViewController(animated: false)
}
// self.navigationController?.viewControllers = navigationArray!
}
}
//
// same as function above but goes to MainVC
//
func checkDoubleColumnMainVCViewStatusAndNavigateAcordingly(){
if UserDefaults.standard.integer(forKey: KEY_MAIN_VC_VIEW) == 0{
// let appDel = UIApplication.shared.delegate as! AppDelegate
// appDel.goToMainVC()
let mainVC = storyboard?.instantiateViewController(withIdentifier: "MainVC") as! MainVC
self.navigationController?.viewControllers[0] = mainVC
var navigationArray = self.navigationController?.viewControllers
print("Number of VCs = \(String(describing: navigationArray?.count))")
if navigationArray?.count == nil{
navigationController?.pushViewController(mainVC, animated: false)
}else{
self.navigationController?.popToRootViewController(animated: false)
}
// self.navigationController?.viewControllers = navigationArray!
}
}
Run Code Online (Sandbox Code Playgroud)
借助这两个控制器的ViewWillAppear中的控件,我调用这些函数进行相应的切换。
有什么想法我做错了吗?我可以从UITabBarController而不是NavigationController推送控制器吗?就像是:
tabBarController.pushViewController(mainVC, animated: false)
Run Code Online (Sandbox Code Playgroud)
代替:
navigationController.pushViewController(mainVC, animated: false)
Run Code Online (Sandbox Code Playgroud)
先感谢您
更新:
在最好的情况下,如果一切正常,在第一次启动应用程序(第二次启动mainVC)时,Buttonsin NavBar无效。
编辑:
我只是意识到NavigationBar我在上方看到的SecondMainVC是NavigationBarfrom MainVC,这就是为什么按钮不起作用的原因。那怎么可能?
在尝试在情节提要中开发选项卡栏控制器时遇到了相同的问题,因此我发现最好的方法是通过代码实现它。因此您可以使代码看起来像这样:
1)创建一个UITabController的子类,并使其符合UITabBarControllerDelegate
class TabBarVC: UITabBarController , UITabBarControllerDelegate {
Run Code Online (Sandbox Code Playgroud)
2)然后在您的类中编写此方法以初始化项目中的选项卡:
private func settingUpTabBarAndInitializingViewControllers(){
//self delagting
self.delegate = self
//home tab
let homeStoryboard = UIStoryboard(name: Constants.StoryBoards.homeStoryboard, bundle: nil)
let homeVC = homeStoryboard.instantiateViewController(withIdentifier: Constants.ControllersIDs.homeScreen) as! HomeVC
// shop tab
let shopStoybaord = UIStoryboard(name: Constants.StoryBoards.shopStoryboard, bundle: nil)
let shopVC = shopStoybaord.instantiateViewController(withIdentifier: Constants.ControllersIDs.shopScreen) as! ShopVC
//offers tab
let offersStoryboard = UIStoryboard(name: Constants.StoryBoards.offersStoryboard, bundle: nil)
let offersVC = offersStoryboard.instantiateViewController(withIdentifier: Constants.ControllersIDs.offersScreen) as! OffersVC
//more tab
let moreStoryboard = UIStoryboard(name: Constants.StoryBoards.MoreScreenStoryboard, bundle: nil)
let moreVC = moreStoryboard.instantiateViewController(withIdentifier: Constants.ControllersIDs.moreVCScreen) as! MoreOptionsTVC
//setting VCs
self.viewControllers = [homeVC , shopVC , offersVC , moreVC]
//setting buttons
//buttons images
let homeImage = UIImage(named: "TabHome")
let shopImage = UIImage(named : "TabShop")
let offerImage = UIImage(named: "TabOffers")
let moreImage = UIImage(named: "TabMenu")
// buttons shakhsiyan
let homeButton = UITabBarItem(title: homeText, image: homeImage, selectedImage: homeTappedImage)
let shopButton = UITabBarItem(title: shopText, image: shopImage, selectedImage: shopTappedImage)
let offersButton = UITabBarItem(title: offersText, image: offerImage, selectedImage: offersTappedImage)
let moreButton = UITabBarItem(title: moreText, image: moreImage, selectedImage: moreTappedImage)
homeVC.tabBarItem = homeButton
shopVC.tabBarItem = shopButton
offersVC.tabBarItem = offersButton
moreVC.tabBarItem = moreButton
}
Run Code Online (Sandbox Code Playgroud)
PS,您可以根据需要添加任意数量的标签,并且在滚动标签时不会遇到任何错误,
确保在标签栏控制器之前只有一个导航控制器。
| 归档时间: |
|
| 查看次数: |
4182 次 |
| 最近记录: |