如何在swift ios中刷新标签栏项目
Posted
技术标签:
【中文标题】如何在swift ios中刷新标签栏项目【英文标题】:How to refresh Tab Bar Items in swift ios 【发布时间】:2017-10-30 22:00:02 【问题描述】:我用标签栏项目做类似Instagram
的应用程序。在应用程序中,我有 simple user
和 company 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?