在 applicationDidFinishLaunching 之前调用 viewDidLoad

Posted

技术标签:

【中文标题】在 applicationDidFinishLaunching 之前调用 viewDidLoad【英文标题】:viewDidLoad called before applicationDidFinishLaunching 【发布时间】:2014-02-07 16:59:01 【问题描述】:

我有一个我自己无法解决的问题。我必须先从我的 Web 服务器下载数据,然后用户才能看到视图(UITableViewController),所以在 UITableView 应该可见的时候,它应该有要显示的内容。问题是,我开始下载applicationDidFinishLaunching中的数据,我在viewDidLoadapplicationDidFinishLaunching中有NSLogs,有趣的是viewDidLoadNSLogsNSLogs之前被调用的applicationDidFinishLaunching (那些NSLogs 是在所有数据下载后写的)。

一旦我完成下载数据,我有一个NSMutableArray,我从AppDelegate 传递到TableViewController,但tableViewController 看起来完全是空的,因为ViewDidLoad 在所有数据之前被调用已下载。

然后我有 1 个问题:在加载 TableView 之前我应该​​在哪里下载所有数据?

我一直在考虑的解决方案:我考虑过创建另一个 ViewController(这将是主视图),其中 UIImageView 具有图像“正在加载...” :在那里我下载了我需要的所有数据并将所有数据存储到NSMutableArray。下载数据后,我调用UITableViewController 并将NSMutableArray 传递给UITableViewController。我确信这个解决方案会起作用,但它必须是一种更简单的方法来解决这个问题。

【问题讨论】:

您是否尝试过使用断点来查看 viewDidLoad 是否在 applicationDidFinishLaunching 之前被实际调用? 【参考方案1】:

一个好的解决方案是创建一个委托方法,在下载完成时告诉您的 ViewController。而在方法的实现上,你调用[yourTableView reloadData]。

在您将下载数据的课程上(在 YourDownloadClass.h 上):

@protocol WebServiceConsumerDelegate 

//@required
-(void) requestDidFinishSuccessfully:(NSArray*) resultArray;

@end

@interface YourDownloadClass : UIViewController

@property (strong, nonatomic) id <WebServiceConsumerDelegate> delegate;

在您下载数据后的 YourDownloadClass.h 上:

[self.delegate requestDidFinishSuccessfully:resultArray];

现在,转到您的 TableViewClass.h

#import "YourDownloadClass.h"

@interface TableViewClass : UITableViewController <WebServiceConsumerDelegate>

最后,在 TableViewClass.m 上:

-(void)viewDidLoad
 [super viewDidLoad];

 YourDownloadClass* delegateClass = [YourDownloadClass alloc] init];

 // Or if you are downloading on AppDelegate:
 AppDelegate* delegateClass = [UIapplication sharedApplication];

 delegateClass.delegate = self;


最后,实现方法:

-(void)requestDidFinishSuccessfully:(NSArray*) resultArray

   //Get the objects of resultArray to use on your table view

   [yourTableView reloadData];


我希望它有所帮助。 :)

【讨论】:

我怎样才能创建那个方法?

以上是关于在 applicationDidFinishLaunching 之前调用 viewDidLoad的主要内容,如果未能解决你的问题,请参考以下文章

强制 App 导航到 App DidBecomeActive 中的特定视图

iOS9.3.5如何注册自定义推送通知?

iOS 使用腾讯地图显示用户位置注意事项

iOS5如何“懒惰地”初始化标签栏的控制器?

分配的变量引用在哪里,在堆栈中还是在堆中?

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记