在将 ViewController 添加到 UITabBarController 之前加载数据

Load Data Before Adding ViewControllers to UITabBarController

在我的应用程序中,一旦用户从 LoginViewController 登录,他就会被定向到 ProfileTabBarController

ProfileTabBarControllerUITabBarController 的子类。它由三个视图控制器组成,所有视图控制器都需要对 Profile 实例的引用。

ProfileTabBarController 被推送时,它会加载用户的个人资料。配置文件加载成功后,它会在其每个视图控制器上设置对配置文件的引用,然后将它们添加为选项卡项。

我选择这种方法的原因是,如果用户启动应用程序并且他的令牌还没有过期,应用程序应该直接进入 ProfileTabController;用户无需再次登录。与其在 AppDelegateLoginViewController 中重复加载配置文件的代码,我觉得最好将其封装在 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
        }
    
    }
    

这样,视图控制器在登录后立即显示,无需加载屏幕。