gpt4 book ai didi

ios - UICollectionView 在刷新时重复和重新排序单元格内容

转载 作者:行者123 更新时间:2023-11-29 12:45:51 25 4
gpt4 key购买 nike

我正在尝试完成 iTunes U CS193P iOS 编程类(class)。我在使用 UICollectionView 将卡片显示为 Set 游戏实现的一部分时遇到了一些问题。单击导致 UICollectionView 刷新的卡片时,我看到了一个非常奇怪的行为。内容将重新排序,有时会在 View 中重复。查看之前和之后的两个示例 here .

我相当确定这与我的 UICollectionView 实现有关,因为游戏逻辑已经使用按钮进行了测试。

点击“ View Controller ”中的代码:

- (IBAction)touchCard:(UITapGestureRecognizer *)sender {
CGPoint tapLocation = [sender locationInView:self.cardCollectionView];
NSIndexPath *indexPath = [self.cardCollectionView indexPathForItemAtPoint:tapLocation];
if (indexPath) {
[self.game chooseCardatIndex:indexPath.item];
[self updateUI];
}
}

updateUI代码:

- (void)updateUI
{
// Reload data for cardCollectionView
[self.cardCollectionView reloadData];

// For each cell within the UICollectionViewCell
for (UICollectionViewCell *cell in [self.cardCollectionView visibleCells]) {

NSIndexPath *indexPath = [self.cardCollectionView indexPathForCell:cell];
Card *card = [self.game cardAtIndex:indexPath.item];
if([card isKindOfClass:[SetCard class]]) {
SetCard *setcard = (SetCard *)card;
NSLog([NSString stringWithFormat:@"index %d updated with %d,%d,%d,%d",indexPath.item,setcard.rank,setcard.color,setcard.shape,setcard.pattern]);
// Updates individual cards for each cardCollectionView
[self updateCell:cell usingCard:card animated:YES];
}
}
}

这会更新单元格 View :

- (void)updateCell:(UICollectionViewCell *)cell usingCard:(Card *)card animated:(BOOL)animated
{
setCardView *cardView = ((setCardCellView *)cell).setCardV;

if([card isKindOfClass:[SetCard class]]) {
SetCard *setCard = (SetCard *)card;

// Set attributes of the card in the cardView
cardView.rank = setCard.rank;
cardView.shape = setCard.shape;
cardView.pattern = setCard.pattern;
cardView.color = setCard.color;

// Set chosen cards
cardView.selected = setCard.isChosen;
}
}

最后是 collectionView 所需的方法 cellForItemAtIndexPath:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:[self reuseIdentifier] forIndexPath:indexPath];
Card *card = [self.game cardAtIndex:indexPath.item];

[self updateCell:cell usingCard:card animated:YES];
return cell;
}

感谢您的协助。

最佳答案

当您实现 cellForRowAtIndexPath/cellForItemAtIndexPath 方法时,您必须完全配置从 dequeue 方法返回的每个单元格。

如果该行的卡片对象是 SetCard 类型,您的代码只会配置单元格。如果卡片对象不是 SetCard,则不要管单元格。这意味着,如果您从 dequeue 方法获得的单元格以前用于显示 SetCard,但卡片对象不是 SetCard,则单元格的 View 不会更改,并且仍会显示旧值。

在您的 if 语句中添加一个 else 子句,如果卡片对象不属于 SetCard 类,则将字段设置回它们的默认状态。

关于ios - UICollectionView 在刷新时重复和重新排序单元格内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23705550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com