我在我的应用程序中使用pull来刷新集合视图但是app崩溃了。
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds for empty array'
我正在使用异步队列从服务器获取数据。
以下是我从服务器获取数据并在成功时更新ui的代码:
refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(startRefresh:)
forControlEvents:UIControlEventValueChanged];
- (void)startRefresh:(UIRefreshControl *)refreshcontrol
{
dispatch_queue_t fetchQueue = dispatch_queue_create("fetch Queue", NULL);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//webservice call which on success post notification
});
}
- (void)onSuccess:(NSNotification *)success { //notification after success of webservice
[storyCollectionView setHidden:NO];
NSLog(@"fun:%s", __func__);
dispatch_async(dispatch_get_main_queue(), ^{//in the main queue i'm ending refresing
if ([refreshControl isRefreshing]) {
[refreshControl endRefreshing];
}
[CollectionView reloadData];// reloading collection view
}
);
}
答案 0 :(得分:3)
我认为您应该在调用 refreshcontrol.endrefreshing 后重新加载集合视图或表格视图。 像:-
@objc func refresh(sender:AnyObject) {
// Code to refresh table view
//Do all other API Calling stuff here
refreshControl.endRefreshing()
self.tableviewList?.reloadData()
}
它将完美运行!! :)
答案 1 :(得分:1)
这是因为数据模型中的数据与UITableView的日期源方法返回不一致。
答案 2 :(得分:0)
在你的集合视图中,数据源检查数组是否为空,你试图访问一个空数组,使用下面的代码检查数组是否为空并返回0。
if (array == nil){
return 0;
}
答案 3 :(得分:0)
执行pull刷新时。它的默认行为是重新加载表,那时你的数组变成空白,所以它会崩溃。所以为此在获得Web服务响应后分配您的数组。
dispatch_queue_t fetchQueue = dispatch_queue_create("fetch Queue", NULL);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//webservice call which on success post notification
});
没有必要使用此方法。它会降低应用性能。因为它等待队列或主线程变得免费。
答案 4 :(得分:0)
问题是你从数组中获取值而不检查数组的大小