如何以不同的方法访问 uicollectionviewcell 对象?

Posted

技术标签:

【中文标题】如何以不同的方法访问 uicollectionviewcell 对象?【英文标题】:How to access uicollectionviewcell objects in different methods? 【发布时间】:2015-07-10 12:31:54 【问题描述】:

我有一个集合视图,并且我对集合视图单元进行了子类化,所以我有重复的内容。

在我的集合视图类中,我使用此方法访问和设置单元格中的对象,例如设置附加到单元格的标签?

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath


CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" forIndexPath:indexPath];


//Configure Cell


//Set Name
DataManager *dm = [DataManager sharedInstance];
NSMutableArray *names = [dm objectForKey:@"nameArray"];
NSString *name = [names objectAtIndex:indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@", name]; //set cell here

    return cell;

但是,我需要更新cell.textLabel,但我无法通过其他方法访问cell.textLabel

我怎样才能通过除此之外的其他方法访问cell.textLabel

*注意,我想更新我的所有单元格,而不仅仅是一个单元格。

【问题讨论】:

您想何时更新 textLabel? @hoya21 多次,一旦应用程序收到推送通知,我想要一种方法来触发 textLabel 的更新,但是我不想这样做 [collectionView reloadData]; 因为我有一个转换应用于我的单元格,这将重置单元格大小(看起来很糟糕),这就是我只想访问 textLabel 的原因。 要重新加载 UICollectionview 的单个单元格,您可以参考此链接***.com/a/20318136/3792386 【参考方案1】:

您只能使用visibleCells 方法访问“可见”UICollectionViewCell

对于那些“不可见”的单元格,您必须在collectionView:cellForItemAtIndexPath 中进行配置。

【讨论】:

【参考方案2】:

所以我建议你保留一个数组,其中包含要更改的单元格的 indexPaths,然后每次要更改文本时调用一个方法并更改它们。这是一种我每次想要只更改一个单元格的方法。

-(void) makePriorCell:(NSIndexPath *) indexPath

UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];

//cell.backgroundColor = [UIColor greenColor];
UILabel *label = (UILabel *)[cell viewWithTag:101];

if (indexPath.item==0) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"2A copy.png"];



else if (indexPath.item==1) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"3A copy.png"];


else if (indexPath.item==2) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"4A copy.png"];


else if (indexPath.item==3) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"5A copy.png"];


else if (indexPath.item==4) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"5a_Istoria_Perivallon copy.png"];


else if (indexPath.item==5) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"7A copy.png"];


else if (indexPath.item==6) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"6A copy.png"];


else if (indexPath.item==7) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"8A copy.png"];


else if (indexPath.item==8) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"9A copy.png"];


else if (indexPath.item==9) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"10A copy.png"];


else if (indexPath.item==10) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"11A copy.png"];



else if (indexPath.item==11) 

    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
    recipeImageView.image = [UIImage imageNamed:@"12A copy.png"];





label.textColor = [UIColor blackColor];



cell.backgroundColor=[UIColor whiteColor];

出于我的目的,我更改了指定单元格的图像、文本颜色和单元格背景。如果你有一个标签,你可以对你想要的单元格的文本做同样的事情。

【讨论】:

谢谢,但这不是我需要的。我希望能够更新我的所有单元格,我真正需要的是一种访问我的子类textLabel 变量的方法,这样我就可以完全按照我在提供的代码中所做的事情。我需要一种方法来回忆这段代码。【参考方案3】:

您的CollectionViewCell 只是视图,您应该从模型中提供信息并相应更新,就像您在- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 中所做的那样

我当时的建议是先更新您的模型,然后再更新您的单元格:

dm[@"nameArray"] = updated_info //Updated names
[DataManager sharedInstance] = ...//Update DataManager
collectionView.reloadData //Update all your cells

我还要小心在 cellForItemAtIndexPath: 方法中调用DataManager *dm = [DataManager sharedInstance];。也许最好为此使用依赖注入。你可以看到更多关于here

【讨论】:

以上是关于如何以不同的方法访问 uicollectionviewcell 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何以角度访问来自不同组件的数组

如何配置多个用户以不同的权限访问多个资源?

如何控制并发以不同进程同时访问行

使用 UICollectionView 收到内存警告以查看图像

从不同的 .js 文件中访问来自 1 个 .js 源文件 (jqTree) 的变量以覆盖方法

ListView:如何从外部以编程方式访问 Item 的元素?