【问题标题】:Change ViewController from Tabbar从标签栏更改 ViewController
【发布时间】:2018-05-28 10:33:44
【问题描述】:

我有一个UITabBarController,带有 3 个选项卡和一个SettingsVC,您可以在其中选择MainVC 的外观(有2 个不同的ViewControllers,根据用户的喜好应显示为MainVC) .

我创建了这个应用程序,它可以工作,但它确实有问题,因为我只是将ViewControllers 相互叠加,并且在某些特定情况下,您在切换tabs 时会看到错误。

Main.storyboard

这是我的代码的一部分(在尝试了很多东西之后),它根据 UserDefaults 更改了 VC

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!
    }
}

在这两个控制器的 ViewWillAppear 中,我调用这些函数进行相应的切换。

任何想法我做错了什么?我可以从 UITabBarController 而不是 NavigationController 推送控制器吗?类似:

tabBarController.pushViewController(mainVC, animated: false)

代替:

navigationController.pushViewController(mainVC, animated: false)

提前谢谢你

更新:

在我最好的情况下,当一切正常时,在第一次启动应用程序时(到第二个 mainVCNavBar 中的 Buttons 不起作用。

编辑:

我刚刚意识到我在SecondMainVC 上方看到的NavigationBar 是来自MainVCNavigationBar,这就是按钮不起作用的原因。这怎么可能?

【问题讨论】:

  • 首先你不能从 tabBarController 推送控制器。相反你可以使用 tabBarController.selectedIndex = 1 设置一个特定的 viewController 来切换
  • @Vikky 如果我做对了,如果selectedIndex 表示我的一个 VC 则不起作用,因为第一个选项卡是 MainVC,第二个是 CategoriesVC,第三个是 @987654344 @。因为我在另一个选项卡中没有我的SecondMainVC,所以我只想有条件地在第一个选项卡上显示另一个 VC。我做对了吗?你明白我的意思了吗?
  • 您提供的图像非常模糊,因此很难从中进行检查。现在回到您的问题,是的,您说对了。现在,如果您想在第一个选项卡中打开另一个 VC,您必须以编程方式替换您的视图控制器。
  • @Vikky 我会尝试更改图片,但我不知道如何使用选定的索引来更改它,你能写一些代码吗?我也只是尝试直接分配VC,例如tabBarController?.selectedViewController = mainVC 但在启动时应用程序崩溃了。
  • @Vikky 照片变了,希望现在更好

标签: swift uinavigationcontroller uitabbarcontroller


【解决方案1】:

我在尝试在 storyboard 中开发标签栏控制器时遇到了同样的问题,因此我发现最好的方法是通过代码来实现它。 所以你可以让你的代码看起来像这样:

1)创建一个UITabController的子类,让它符合UITabBarControllerDelegate

  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

}

附:您可以根据需要添加标签,并且在滚动时不会遇到任何错误,

确保在标签栏控制器之前只有一个导航控制器。

【讨论】:

  • 我设置了它,但我没有导航栏了。可能是什么问题呢?从一开始我就有一个 TabBar(具有上述类),之后是一个 NavigationController,它的根是我的 homeVC。 (我按你说的删除了其他 NavControllers
  • 问题是你在标签栏控制器之后添加了一个导航栏,去掉了homeVC的导航栏,并确保你在标签栏控制器之前只有一个导航栏(有标签bar 控制器作为根视图控制器),这个导航栏将负责 HomeVC 之后的所有其他控制器
  • 哦,我不知道该怎么做,并认为这是不可能的,好吧,看来我已经接近了,现在我在任何导航栏中都没有按钮,徽标标题,这是唯一剩下的事情(即使在每个 VC 的 viewdidload 中我以编程方式设置它们)
  • 我在下面的链接link 中发布了您的问题的解决方案
  • 啊抱歉,要在每个选项卡中设置您需要的导航栏按钮,您必须在主 tabBarVC 中设置它们,然后由代表将他们的操作设置到每个选项卡。
【解决方案2】:

检查这个希望它有帮助

好的,你可以创建一个 DEMO 来看看它是如何工作的。之后你可以在你的项目中实现它。我知道它对你来说可能看起来不太好,但是阅读它一次并查看附加的图片,我相信你会得到答案。

1.我用 UITabBarController 创建了两个 UIViewControllers。

2.我创建了类 ItemFirstVC,ItemTwoVC 并分配给情节提要中的 UIViewControllers

3.每个控制器都嵌入在UINavigationController中

4.创建UITabBarController的自定义类

5.在storyboard中赋值给UITabBarController

6.现在每个 UIViewController 都有一个名为 Firs Button,Second Button 的按钮

7. 如图所示,我已将 Action Segue 连接到另一个控制器。

8.现在我创建了第三个 UIViewController,它与 UITabBarController 分开。

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
}
 }

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多