Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UICollectionviewCell中,最初未加载单元格数据_Ios_Objective C_Uicollectionview_Uicollectionviewcell_Uicollectionviewdelegate - Fatal编程技术网

Ios 在UICollectionviewCell中,最初未加载单元格数据

Ios 在UICollectionviewCell中,最初未加载单元格数据,ios,objective-c,uicollectionview,uicollectionviewcell,uicollectionviewdelegate,Ios,Objective C,Uicollectionview,Uicollectionviewcell,Uicollectionviewdelegate,在UIcollectionviewcell中,最初未将单元格数据加载到单元格中,但已加载单元格的布局。当滚动到最后一个单元格并向后滚动时,它似乎正确地填充了数据,没有任何问题。我从json数组中获取数据。获取json数组后,我将重新加载集合视图。我使用的原型细胞在故事板与自动布局。我曾尝试使用按钮操作重新加载,但在这种情况下,只有可见单元格得到更新,我使用的是flowlayout和水平滚动 这是我的cellforitem代码 - (UICollectionViewCell *)collect

在UIcollectionviewcell中,最初未将单元格数据加载到单元格中,但已加载单元格的布局。当滚动到最后一个单元格并向后滚动时,它似乎正确地填充了数据,没有任何问题。我从json数组中获取数据。获取json数组后,我将重新加载集合视图。我使用的原型细胞在故事板与自动布局。我曾尝试使用按钮操作重新加载,但在这种情况下,只有可见单元格得到更新,我使用的是flowlayout和水平滚动 这是我的cellforitem代码

  - (UICollectionViewCell *)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath
{
 UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ColCell" forIndexPath:indexPath];

 UIImageView *img1=(UIImageView *)[cell viewWithTag:13];


 img1.image = [UIImage imageNamed:@"profile_pic.png"];

 if (![[[tableArray objectAtIndex:indexPath.row] valueForKey:@"img_extension"]isEqual:[NSNull null]]  ) {
    [img1 sd_setImageWithURL:[NSURL URLWithString:[[tableArray objectAtIndex:indexPath.row]valueForKey:@"img_extension"]] placeholderImage:nil completed:^(UIImage *image12, NSError *error, SDImageCacheType cachetype, NSURL *imageurl){

        if(error)
            img1 .image = nil;
        else
            img1 .image = image12;
        CGPoint saveCenter1 = img1.center;
        CGRect newFrame1 = CGRectMake(img1.frame.origin.x, img1.frame.origin.y,50, 50);
        img1.frame = newFrame1;
        img1.layer.cornerRadius = 50 / 2.0;
        img1.center = saveCenter1;
        img1.clipsToBounds = YES;
    }];
 }
 UILabel *lbl1=(UILabel *)[cell viewWithTag:1];
 UILabel *lbl2=(UILabel *)[cell viewWithTag:2];
 UILabel *lbl3=(UILabel *)[cell viewWithTag:3];
 UILabel *lbl4=(UILabel *)[cell viewWithTag:4];
 UILabel *lbl5=(UILabel *)[cell viewWithTag:5];
 UILabel *lbl6=(UILabel *)[cell viewWithTag:6];
 UILabel *lbl11=(UILabel *)[cell viewWithTag:11];
 UILabel *lbl12=(UILabel *)[cell viewWithTag:12];
 UITextView *txtvw = (UITextView *)[cell viewWithTag:7];
 lbl1.text=[[tableArray objectAtIndex:indexPath.row]valueForKey:@"strong_hand"];
 lbl2.text=[[tableArray objectAtIndex:indexPath.row]valueForKey:@"athleticism"];
 lbl3.text=[[tableArray objectAtIndex:indexPath.row]valueForKey:@"stick_skills"];
 lbl4.text=[[tableArray objectAtIndex:indexPath.row]valueForKey:@"dodging"];
 lbl5.text=[[tableArray objectAtIndex:indexPath.row]valueForKey:@"shooting"];
 lbl6.text=[[tableArray objectAtIndex:indexPath.row]valueForKey:@"lacrosse"];
 lbl11.text=[[tableArray objectAtIndex:indexPath.row]valueForKey:@"instructor_name"];
 lbl12.text=@"INSTRUCTER";
 txtvw.text = [[tableArray objectAtIndex:indexPath.row]valueForKey:@"comment"];

 [cell layoutSubviews];
 return cell;
}

所以我猜tableArray的大小是固定的,这就是它不会崩溃的原因。如果您获取的单元格没有数据,则可能是您没有正确提供数据。我敢打赌,在您第一次重新加载时,tableArray充满了nils,或者您正在异步获取JSON,但您没有在主线程上重新加载它,因为您只能在主线程上更新视图。cellForItemAtIndexPath仅重新加载可见单元格按预期工作,只需数据即可。
顺便说一句,通过标记和valueForKey获取所有属性和对象的方法非常可怕:

在这一行lbl2.text=[[tableArray objectAtIndex:indexPath.row]valueForKey:@Athleticity];然后在调试器控制台po[[tableArray objectAtIndex:indexPath.row]valueForKey:@Athleticity]中键入该值,然后按enter键。这将告诉您数组中是否有数据

如果您得到nil作为响应,那么请查看tableArray本身是否为nil po tableArray

还有,你为什么用如此糟糕的方式编写代码?为什么在cell对象上使用viewWithTag而不是创建作为IBOutlets的属性,以便可以访问它们cell.titleLabel.text=。。。?
为什么要使用objectForKey?为什么不直接获取对对象MyClass*object=[tableArray objectAtIndex:indexPath.row]的引用;然后使用它lbl1.text=object.strong\u hand

tablearray中的值不是nil。我确信这一点,因为我尝试过另一种方法,将数组从另一个类传递给这个类,并在viewdidload中调用[collectionview reload],在此之前,我已经“记录”了数据及其显示的数组值必须将断点放在这个方法中,并正常测试它。此代码只有3种可能失败。1.重新加载后根本没有调用此方法,因为调用重新加载->2的正确方法存在问题。那时你的餐桌上满是零->3。您试图通过标记获取的UILabel是nils,这不太可能,因为它们在某些时候被使用。我所能想到的所有其他可能性都会使你的应用程序崩溃。加载的集合单元格的数量是正确的,即tablearray中的值的数量也是集合视图大小的代码也被称为数组中的值的数量,当在上面的代码中放入断点时,集合视图单元格的大小与屏幕大小相同。我找到了一个解决方案,使用delay调用performSelector,并在`-voidScrollViewDiEndDraging:UIScrollView*scrollView willDecreate:BOOLdecelerate`中添加集合重载,如果delay能帮到你,那就证明我是正确的。您正在异步加载数据,当您最初调用reload时,您的数据仍在加载。如果是这种情况,那么当我从另一个类传递数据时出现了什么问题?不,我在执行上述步骤时获取tablearray的值。也谢谢你的代码建议。如果你不介意的话,我想看看你的代码。你能上传你的项目并在这里发布一个链接吗?很抱歉,我不能这样做,这个项目是为其他人创建的。无意冒犯,但你认为你准备好承担这样的风险了吗?谢谢你的关注,我已经找到了解决这个问题的方法,所以是的,我准备承担这样的风险