我使用标签栏项目为Instagram
做app。在应用中,我有simple user
和company user
。
我有主ViewController:
MainTabBarController: UITabBarController
有5个标签栏项目。每个项目都有自己的ViewController
当用户为MainTabBarController
时,我需要刷新Simple user
这是5项,当用户为Company user
时,我需要4项。如何在没有关闭应用程序的情况下刷新或重新加载?
我已经使用UserDefaults做了一个解决方案,但需要关闭应用程序。
平台iOS> 9.0,Swift 3.0
答案 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个类:
用动画更改用户界面:
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))