如何在swift ios中刷新Tab Bar项目

时间:2017-05-30 12:17:10

标签: ios swift uitabbarcontroller reload uitabbaritem

我使用标签栏项目为Instagram做app。在应用中,我有simple usercompany user

我有主ViewController:

MainTabBarController: UITabBarController

有5个标签栏项目。每个项目都有自己的ViewController

当用户为MainTabBarController时,我需要刷新Simple user这是5项,当用户为Company user时,我需要4项。如何在没有关闭应用程序的情况下刷新或重新加载?

我已经使用UserDefaults做了一个解决方案,但需要关闭应用程序。

平台iOS> 9.0,Swift 3.0

4 个答案:

答案 0 :(得分:4)

使用setViewControllers(_:animated:)

myTabBarController.setViewControllers(myViewControllers, animated: true)

答案 1 :(得分:0)

通常通知根本不是很开心,Swift鼓励所有程序员使用协议而不是通知...如何为委托或设置变量的didSet选项?你甚至根本不需要通知。我想TabBar是在登录后立即推送的,所以你只需要创建类变量,然后在didSet中设置viewControllers:

///Considering UserType is enum with cases:
var currentUserType: UserType{
didSet{
currentUserType = .company ? self.viewControllers = /*array with 5 count*/ : self.viewControllers = /*array with 4 counts*/
}
}

现在只需根据viewControllers处理其余部分。

答案 2 :(得分:0)

我得到了解决方案: 我将 MainTabBarController 分为3个类:

  1. AnonymUserTabBarController。设置5个标签栏项目。
  2. SimpleUserTabBarController。设置5个标签栏项目。
  3. CompanyTabBarController。设置4个标签栏项目。
  4. 用动画更改用户界面:

    func selectCompanyUser() {
        guard let window = UIApplication.shared.keyWindow else {
            return
        }
    
        guard let rootViewController = window.rootViewController else {
            return
        }
    
        let viewController = CompanyTabBarController()        
        viewController.view.frame = rootViewController.view.frame
        viewController.view.layoutIfNeeded()
    
        UIView.transition(with: window, duration: 0.6, options: .transitionFlipFromLeft, animations: {
            window.rootViewController = viewController
        }, completion: nil)
    }
    

答案 3 :(得分:-1)

您可以发布通知以根据用户类型刷新选项卡,首先在MainTabBarController中设置观察者,一旦触发通知,检查用户类型并刷新选项卡

extension Notification.Name {
    static let refreshAllTabs = Notification.Name("RefreshAllTabs")
}

class MainTabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(forName: .refreshAllTabs, object: nil, queue: nil) { (notification) in
            //check if its a normal user or comapny user
            if AppUser.shared.type == .normal {
                self.viewControllers = [VC1, VC2, VC3, VC4, VC5]
            } else  {
                self.viewControllers = [VC1, VC2, VC3, VC4]
            }
        }
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

现在只要在用户类型更改时发布通知,只需调用

 NotificationCenter.default.post(Notification(name: .refreshAllTabs))