如何在swift ios中刷新标签栏项目

Posted

技术标签:

【中文标题】如何在swift ios中刷新标签栏项目【英文标题】:How to refresh Tab Bar Items in swift ios 【发布时间】:2017-10-30 22:00:02 【问题描述】:

我用标签栏项目做类似Instagram 的应用程序。在应用程序中,我有 simple usercompany user

我有主视图控制器:

MainTabBarController: UITabBarController

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

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

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

平台 iOS > 9.0、Swift 3.0

【问题讨论】:

【参考方案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: .main)  (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))

【讨论】:

wuuu 坚持这些通知,你可能会让自己陷入非常糟糕的境地。 这是解决问题的方法之一,是标准的苹果设计模式。你能解释一下它是如何以及为什么对这种情况不利的吗? 见我上面的回答。有时间我可以通过委托扩展方法。【参考方案2】:

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

    匿名用户选项卡控制器。设置 5 个标签栏项。 SimpleUserTabBarController。设置 5 个标签栏项。 CompanyTabBar 控制器。设置 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】:

通常通知真的一点也不 swifty,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 处理其余部分。

【讨论】:

【参考方案4】:

使用setViewControllers(_:animated:)

myTabBarController.setViewControllers(myViewControllers, animated: true)

【讨论】:

我认为第一行就足够了.. :D。它看起来只是一个很小的答案,导致您添加另一行。 只是确保:D

以上是关于如何在swift ios中刷新标签栏项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在单击 tabBar 项目 Swift 上刷新 tableView?

如何在swift中隐藏/禁用标签栏项目

如何在 Swift 的标签栏项目中设置图像?

如何在 ios swift 中以编程方式将情节提要视图控制器加载到标签栏控制器中?

在 Swift 3 中单击标签栏项目时从底部打开弹出窗口?

如何使用 Swift 在 iOS 中创建类似于标签栏选择动画的 LinkedIn?