Swift 从选项卡栏更改ViewController

Swift 从选项卡栏更改ViewController,swift,uinavigationcontroller,uitabbarcontroller,Swift,Uinavigationcontroller,Uitabbarcontroller,我有一个带有3个选项卡的UITabBarController和一个SettingsVC,您可以在其中选择MainVC的外观(有两个不同的ViewControllers,根据用户的喜好显示为MainVC) 我制作了这个应用程序,它可以正常工作,但它确实有问题,因为我只是把视图控制器推到了另一个上面,在某些情况下,在切换选项卡时你会看到问题 主故事板 这是我的代码的一部分(在尝试了很多东西之后),它根据UserDefaults 支票设置status.swift 在视图中显示这两个控制器时,我调用这

我有一个带有3个选项卡的
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