Swift 从选项卡栏更改ViewController
我有一个带有3个选项卡的Swift 从选项卡栏更改ViewController,swift,uinavigationcontroller,uitabbarcontroller,Swift,Uinavigationcontroller,Uitabbarcontroller,我有一个带有3个选项卡的UITabBarController和一个SettingsVC,您可以在其中选择MainVC的外观(有两个不同的ViewControllers,根据用户的喜好显示为MainVC) 我制作了这个应用程序,它可以正常工作,但它确实有问题,因为我只是把视图控制器推到了另一个上面,在某些情况下,在切换选项卡时你会看到问题 主故事板 这是我的代码的一部分(在尝试了很多东西之后),它根据UserDefaults 支票设置status.swift 在视图中显示这两个控制器时,我调用这
UITabBarController
和一个SettingsVC
,您可以在其中选择MainVC
的外观(有两个不同的ViewControllers
,根据用户的喜好显示为MainVC
)
我制作了这个应用程序,它可以正常工作,但它确实有问题,因为我只是把视图控制器
推到了另一个上面,在某些情况下,在切换选项卡时你会看到问题
主故事板
这是我的代码的一部分(在尝试了很多东西之后),它根据UserDefaults
支票设置status.swift
在视图中显示这两个控制器时,我调用这些函数进行相应的切换
知道我做错了什么吗?我可以从UITabBarController而不是NavigationController推送控制器吗?比如:
tabBarController.pushViewController(mainVC, animated: false)
而不是:
navigationController.pushViewController(mainVC, animated: false)
先谢谢你
更新:
在我的最佳情况下,当一切正常运行时,在第一次启动应用程序时(到第二次mainVC
),导航栏中的按钮不起作用
编辑:
我刚刚意识到,我在我的SecondMainVC
上方看到的NavigationBar
是MainVC
中的NavigationBar
,这就是按钮不起作用的原因。这是怎么可能的?我在尝试在故事板中开发选项卡栏控制器时遇到了同样的问题,因此我发现最好的方法是通过代码实现它。
因此,您可以使代码如下所示:
1) 创建UITabController的a子类,并使其符合uitabarcontrollerdelegate
class TabBarVC: UITabBarController , UITabBarControllerDelegate {
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
}
另外,你可以添加任意多的标签,在其中滚动时,你不会遇到任何错误
请确保在选项卡栏控制器之前只有一个导航控制器。我在尝试在故事板中开发选项卡栏控制器时遇到了相同的问题,因此我发现最好的方法是通过代码实现它。
因此,您可以使代码如下所示:
1) 创建UITabController的a子类,并使其符合uitabarcontrollerdelegate
class TabBarVC: UITabBarController , UITabBarControllerDelegate {
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
}
另外,你可以添加任意多的标签,在其中滚动时,你不会遇到任何错误
请确保在选项卡栏控制器之前只有一个导航控制器。检查此选项,希望有帮助
好的,你们可以创建一个演示来看看这个东西是如何工作的。然后你们可以在你们的项目中实现它。我知道它对你们来说可能不太好,但请阅读一次,然后看看附件中的图片,我肯定会得到你们的答案
1.我已使用UITabBarController创建了两个UIVIEW控制器
2.我已经创建了类ItemFirstVC、ItemTwoVC,并将其分配给情节提要中的UIViewController
3.每个控制器都嵌入到UINavigationController中
4.创建UITabBarController的自定义类
5.将其分配给情节提要中的UITabBarController
6.现在每个UIViewController都有一个名为Firs button的按钮,第二个按钮
7.从每个按钮,我都将动作序列连接到一个以上的控制器,如图所示
8.现在我已经创建了第三个UIViewController,它与UIAbbarController分离
9.现在我们将在UITabBarController中加载第三个UIViewController
10.再创建一个类ItemThirdVC并将其分配给第三个UIViewController
11.它还有一个名为“第三个按钮动作”的按钮,该按钮与另一个UIViewController相连
12.现在切换到UITabBarContoller的自定义类
// variable required to see work in action
var count = 0
class CustomTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
// remember to assign delegate
delegate = self
}
// this delegate indicates whether this tab should be selected or not
extension CustomTabBarController : UITabBarControllerDelegate{
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
// switch to UIViewController tabs multiple times
count = count + 1
if(count == 5){
// when count reaches 5 a new controller will load
let navigationController = viewController as? UINavigationController
guard navigationController != nil else {return true}
let viewController = storyboard?.instantiateViewController(withIdentifier: "ItemThreeVC")
guard let vc = viewController else {return true}
navigationController?.setViewControllers([vc], animated: false)
}
return true
}
}
检查一下这个,希望有帮助
好的,你们可以创建一个演示来看看这个东西是如何工作的。然后你们可以在你们的项目中实现它。我知道它对你们来说可能不太好,但请阅读一次,然后看看附件中的图片,我肯定会得到你们的答案
1.我已使用UITabBarController创建了两个UIVIEW控制器
2.我已经创建了类ItemFirstVC、ItemTwoVC,并将其分配给情节提要中的UIViewController
3.每个控制器都嵌入到UINavigationController中
4.创建UITabBarController的自定义类
5.将其分配给情节提要中的UITabBarController
6.现在每个UIViewController都有一个名为Firs button的按钮,第二个按钮
7.从每个按钮,我都将动作序列连接到一个以上的控制器,如图所示
8.现在我已经创建了第三个UIViewController,它与UIAbbarController分离
9.现在我们将在UITabBarController中加载第三个UIViewController
10.再创建一个类ItemThirdVC并将其分配给第三个UIViewController
11.它还有一个名为“第三个按钮动作”的按钮,该按钮与另一个UIViewController相连
12.现在切换到UITabBarContoller的自定义类
// variable required to see work in action
var count = 0
class CustomTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
// remember to assign delegate
delegate = self
}
// this delegate indicates whether this tab should be selected or not
extension CustomTabBarController : UITabBarControllerDelegate{
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
// switch to UIViewController tabs multiple times
count = count + 1
if(count == 5){
// when count reaches 5 a new controller will load
let navigationController = viewController as? UINavigationController
guard navigationController != nil else {return true}
let viewController = storyboard?.instantiateViewController(withIdentifier: "ItemThreeVC")
guard let vc = viewController else {return true}
navigationController?.setViewControllers([vc], animated: false)
}
return true
}
}
首先,您不能从tabBarController推送控制器。相反,您可以使用tabBarController将特定的viewController设置为切换。selectedIndex=1@Vikky如果我没有弄错,如果selectedIndex
表示我的一个VCs不工作,因为第一个选项卡是MainVC
,第二个是分类VC,第三个是设置SVC。因为在另一个选项卡中没有我的SecondMainVC
,所以我只想有条件地在第一个选项卡上显示另一个VC。我做对了吗?你明白我的意思吗?你提供的图像非常模糊,因此很难从中进行检查。现在回到你的问题,是的,我说的没错。现在如果你想在第一个选项卡中打开另一个VC,你必须以编程方式替换视图控制器。@Vikky,我将尝试更改图片,但我不知道如何使用选定的索引来改变这一点,请您编写一些代码好吗?此外,我还尝试直接分配VC,例如tabBarCon