0

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

2 回答 2

0

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

如果您得到nil响应,则查看其tableArray本身是否为 nil po tableArray

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

于 2015-11-04T08:54:26.687 回答
0

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

于 2015-11-04T08:08:30.117 回答