在 applicationDidFinishLaunching 之前调用 viewDidLoad
Posted
技术标签:
【中文标题】在 applicationDidFinishLaunching 之前调用 viewDidLoad【英文标题】:viewDidLoad called before applicationDidFinishLaunching 【发布时间】:2014-02-07 16:59:01 【问题描述】:我有一个我自己无法解决的问题。我必须先从我的 Web 服务器下载数据,然后用户才能看到视图(UITableViewController
),所以在 UITableView
应该可见的时候,它应该有要显示的内容。问题是,我开始下载applicationDidFinishLaunching
中的数据,我在viewDidLoad
和applicationDidFinishLaunching
中有NSLogs
,有趣的是viewDidLoad
的NSLogs
在NSLogs
之前被调用的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 中的特定视图
NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记