在将 ViewController 添加到 UITabBarController 之前加载数据
Load Data Before Adding ViewControllers to UITabBarController
在我的应用程序中,一旦用户从 LoginViewController
登录,他就会被定向到 ProfileTabBarController
。
ProfileTabBarController
是 UITabBarController
的子类。它由三个视图控制器组成,所有视图控制器都需要对 Profile 实例的引用。
当 ProfileTabBarController
被推送时,它会加载用户的个人资料。配置文件加载成功后,它会在其每个视图控制器上设置对配置文件的引用,然后将它们添加为选项卡项。
我选择这种方法的原因是,如果用户启动应用程序并且他的令牌还没有过期,应用程序应该直接进入 ProfileTabController
;用户无需再次登录。与其在 AppDelegate
和 LoginViewController
中重复加载配置文件的代码,我觉得最好将其封装在 ProfileTabBarController
.
中
这种方法的问题在于,在转场期间,UITabBarController
显示为黑色,因为尚未设置视图控制器。我设法通过创建 LoadingViewController
并将其最初设置为 ProfileTabController
中唯一的 UIViewController
来解决这个问题
我的问题是是否有更好的方法来解决这个问题。我真的不喜欢 UIViewController
没有其他目的然后显示加载图标的想法。
呈现一个没有视图的选项卡视图控制器没有多大意义,所以我认为你给它一个视图控制器来处理这个加载状态的解决方案非常有意义。加入一些很酷的动画来让用户开心。
也有可能出现问题,配置文件可能无法正确加载。这个过渡视图控制器似乎是放置代码以处理可能的错误的好地方。
我能够通过使用 NSNotificationCenter
.
来消除加载 ViewController
ProfileTabBarController
添加三个 ViewController 然后开始加载配置文件。
覆盖 func viewDidLoad() {
super.viewDidLoad()
self.setupUI()
self.setupViewControllers()
self.loadProfile()
}
- 加载完成后,
ProfileTabBarController
发出 ProfileDidLoad
通知。
let completion = { (profile: Profile?) in
MBProgressHUD.hideHUDForView(self.view, animated: true)
if let profile = profile {
self.profile = profile
NSNotificationCenter.defaultCenter().postNotificationName(Notification.ProfileDidLoad, object: self.profile)
} else {
UIAlertView(
title: "",
message: NSLocalizedString("Error loading profile", comment: ""),
delegate: nil,
cancelButtonTitle: "OK"
).show()
}
}
ViewController 观察 ProfileDidLoad
通知:
func setupNotificationObserver(){
NSNotificationCenter.defaultCenter().addObserver(self, selector: "profileDidLoad:", name: Notification.ProfileDidLoad, object: nil)
}
@objc func profileDidLoad(notification: NSNotification){
if let profile = notification.object as? Profile{
self.profile = profile
}
}
这样,视图控制器在登录后立即显示,无需加载屏幕。
在我的应用程序中,一旦用户从 LoginViewController
登录,他就会被定向到 ProfileTabBarController
。
ProfileTabBarController
是 UITabBarController
的子类。它由三个视图控制器组成,所有视图控制器都需要对 Profile 实例的引用。
当 ProfileTabBarController
被推送时,它会加载用户的个人资料。配置文件加载成功后,它会在其每个视图控制器上设置对配置文件的引用,然后将它们添加为选项卡项。
我选择这种方法的原因是,如果用户启动应用程序并且他的令牌还没有过期,应用程序应该直接进入 ProfileTabController
;用户无需再次登录。与其在 AppDelegate
和 LoginViewController
中重复加载配置文件的代码,我觉得最好将其封装在 ProfileTabBarController
.
这种方法的问题在于,在转场期间,UITabBarController
显示为黑色,因为尚未设置视图控制器。我设法通过创建 LoadingViewController
并将其最初设置为 ProfileTabController
UIViewController
来解决这个问题
我的问题是是否有更好的方法来解决这个问题。我真的不喜欢 UIViewController
没有其他目的然后显示加载图标的想法。
呈现一个没有视图的选项卡视图控制器没有多大意义,所以我认为你给它一个视图控制器来处理这个加载状态的解决方案非常有意义。加入一些很酷的动画来让用户开心。
也有可能出现问题,配置文件可能无法正确加载。这个过渡视图控制器似乎是放置代码以处理可能的错误的好地方。
我能够通过使用 NSNotificationCenter
.
ProfileTabBarController
添加三个 ViewController 然后开始加载配置文件。
覆盖 func viewDidLoad() { super.viewDidLoad()
self.setupUI()
self.setupViewControllers()
self.loadProfile()
}
- 加载完成后,
ProfileTabBarController
发出ProfileDidLoad
通知。
let completion = { (profile: Profile?) in
MBProgressHUD.hideHUDForView(self.view, animated: true)
if let profile = profile {
self.profile = profile
NSNotificationCenter.defaultCenter().postNotificationName(Notification.ProfileDidLoad, object: self.profile)
} else {
UIAlertView(
title: "",
message: NSLocalizedString("Error loading profile", comment: ""),
delegate: nil,
cancelButtonTitle: "OK"
).show()
}
}
ViewController 观察
ProfileDidLoad
通知:func setupNotificationObserver(){
NSNotificationCenter.defaultCenter().addObserver(self, selector: "profileDidLoad:", name: Notification.ProfileDidLoad, object: nil) } @objc func profileDidLoad(notification: NSNotification){ if let profile = notification.object as? Profile{ self.profile = profile } }
这样,视图控制器在登录后立即显示,无需加载屏幕。