在UICollectionviewCell中,数据最初未加载

时间:2015-11-04 06:59:32

标签: ios objective-c uicollectionview uicollectionviewcell uicollectionviewdelegate

在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;
}

2 个答案:

答案 0 :(得分:0)

所以我猜这里tableArray有固定的大小,这就是它不崩溃的原因。如果您的单元格没有数据,那么您可能没有正确提供这些数据。我敢打赌,在你第一次重新加载时,tableArray充满了nils,或者你是异步获取你的JSON并且你没有在主线程上重新加载它(因为你只能在main上更新你的视图)。 cellForItemAtIndexPath仅重新加载可见单元格正在按预期工作,只需要数据即可完成。 顺便说一句。你通过标签和valueForKey获取所有属性和对象的方式真的很可怕:)

答案 1 :(得分:0)

在此行lbl2.text=[[tableArray objectAtIndex:indexPath.row]valueForKey:@"athleticism"];处放置一个断点并将其输入调试器控制台po [[tableArray objectAtIndex:indexPath.row]valueForKey:@"athleticism"]并按Enter键。这将告诉您阵列中是否有数据。

如果您将nil作为回复,请查看tableArray本身是否为po tableArray

另外,为什么你用这么糟糕的方式编写代码?为什么在viewWithTag对象上使用cell而不是创建属于IBOutlets的属性,因此您可以访问它们cell.titleLabel.text = ...? 你为什么使用objectForKey?为什么不简单地获取对象MyClass* object = [tableArray objectAtIndex:indexPath.row];的引用,然后使用它lbl1.text = object.strong_hand;