Ios 是否可以在加载视图的同时加载UICollectionView中的自定义单元格?
我是iOS新手,似乎遇到了UICollectionView问题 我正在尝试制作一个选项卡栏应用程序,其第一个选项卡是包含集合视图的导航控制器。海关单元的内容(图像、文本)来自web服务。由于下载web服务上的内容需要时间,我希望应用程序启动后立即显示单元格,而不必等待数据加载(,这意味着在加载数据之前)。因此,当屏幕上只有空单元格(&tab栏和导航栏)时,时间会很短 但是,当我的应用程序运行时,单元格会在从web服务加载所有数据的同时创建。有时,当互联网速度较慢时,在加载包含数据的单元格之前,屏幕上很长一段时间都没有显示任何内容。我想知道是否有人能告诉我我做错了什么。提前非常感谢 以下是集合视图控制器实现文件中我的viewDidLoad:方法的代码:Ios 是否可以在加载视图的同时加载UICollectionView中的自定义单元格?,ios,objective-c,uicollectionview,uicollectionviewcell,Ios,Objective C,Uicollectionview,Uicollectionviewcell,我是iOS新手,似乎遇到了UICollectionView问题 我正在尝试制作一个选项卡栏应用程序,其第一个选项卡是包含集合视图的导航控制器。海关单元的内容(图像、文本)来自web服务。由于下载web服务上的内容需要时间,我希望应用程序启动后立即显示单元格,而不必等待数据加载(,这意味着在加载数据之前)。因此,当屏幕上只有空单元格(&tab栏和导航栏)时,时间会很短 但是,当我的应用程序运行时,单元格会在从web服务加载所有数据的同时创建。有时,当互联网速度较慢时,在加载包含数据的单元格之前,屏
- (void)viewDidLoad
{
[super viewDidLoad];
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame
collectionViewLayout:layout];
[self.collectionView setDataSource:self];
[self.collectionView setDelegate:self];
[self.collectionView setBackgroundColor:[UIColor whiteColor];
layout.sectionInset = UIEdgeInsetsMake(0, 5, 10, 5);
layout.minimumLineSpacing = 5;
UINib *nib = [UINib nibWithNibName:@"TDEFeedCollectionViewCell" bundle:nil];
[self.collectionView registerNib:nib forCellWithReuseIdentifier:@"feedCell"];
}
我是否应该改为在loadView:
方法中执行上述实现,并将已配置的UICollectionView
对象分配给集合视图控制器的view
属性,以便在调用loadView:
方法后立即加载单元格
多谢各位
---编辑---
以下是控制器初始值设定项的实现:
- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout
{
self = [super initWithCollectionViewLayout:layout];
if (self) {
self.navigationItem.title = @"News Feeds";
_session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:nil
delegateQueue:nil];
[self fetchFeed];
}
return self;
}
- (void)fetchFeed
{
NSString *requestString = @"http://exampleapi.exampleweb.com/feeds.json";
NSURL *url = [NSURL URLWithString:requestString];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:req
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data
options:0
error:nil];
self.feeds = jsonObject[@"feeds"];
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
}];
[dataTask resume];
}
下面是初始化器中使用的-(void)fetchFeed
方法的实现:
- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout
{
self = [super initWithCollectionViewLayout:layout];
if (self) {
self.navigationItem.title = @"News Feeds";
_session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:nil
delegateQueue:nil];
[self fetchFeed];
}
return self;
}
- (void)fetchFeed
{
NSString *requestString = @"http://exampleapi.exampleweb.com/feeds.json";
NSURL *url = [NSURL URLWithString:requestString];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:req
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data
options:0
error:nil];
self.feeds = jsonObject[@"feeds"];
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
}];
[dataTask resume];
}
在数据源方法中,我只是使用在
-(void)fetchFeed
方法中解析的JSON数据,并将它们分配给适当的单元格视图。苹果公司有一个照片网格视图示例项目,该项目使用智能缓存动态加载资产
如果我是你,我会考虑从这开始,然后用你自己的Web服务调用替换照片LIB调用应该是微不足道的。
这个项目给了你很多免费的东西-相信我,在我看到这个页面之前,我几乎是从头开始写了一些类似的东西。对不起,阿伦利,我完全误解了这个问题 您想要的解决方案(我认为)是在下载完成之前用一些空白数据预先填充
self.feed
,下载完成后,更新数组并重新加载self.collectionView
试着加上这个
self.feeds = [NSArray arrayWithCapacity:10]; // or any other number you want
[self.collectionView reloadData];
之后
在-viewDidLoad
方法中,查看是否有帮助
当然,问题在于,在下载完成之前,您不知道要显示的单元格数量,因此您必须猜测或使用任意数字来解决
注意:注意这种方法,因为它可能会崩溃,因为单元格可能希望在
self.feeds
中找到一些数据。您需要确保单元格准备好获取空白数据。如果您想在下载完成后显示self.collectionView
,可以通过将self.collectionView
的alpha设置为0,并在下载完成后将其设置为1来实现。例如,嗨,Gyfis!非常感谢您的回复!实际上,我希望在应用程序启动时立即显示单元格,而不必等待web数据加载。我该怎么做?非常感谢。如何/在何处提取要在单元格中显示的数据?是否希望在提取过程中显示一些占位符内容?您知道被检索对象的数量吗?或者,您是否希望在第一次启动时不显示任何内容,然后在启动后显示上次查询的结果?无论您决定做什么,viewDidLoad都可以。(顾名思义,它是在加载视图后调用的,而不是在加载过程中)!谢谢你的回复!我已经更新了我的问题。我已经包括了我的初始值设定项和一个相关的自定义方法的实现。当互联网速度变慢时,在加载包含数据的单元格之前,可能会有很长一段时间屏幕上什么都没有。我想在第一次启动时显示空单元格,然后显示来自web服务的查询结果!谢谢你的回复!我的内容纯粹来自互联网。我想在第一次启动时显示空单元格,然后显示来自web服务的查询结果。然而,在我当前的实现中,在加载web服务器的内容之前,屏幕上可能会有很长一段时间没有任何内容(没有单元格)。如何在启动时立即显示空单元格?非常感谢。如果您的解决方案基于引用的示例项目,则可以立即显示空网格视图,并在数据进入时填充单元格。苹果的例子适用于网络图像(iCloud),所以你可以根据自己的需要利用它。