gpt4 book ai didi

ios - 滚动时 UITableView 不刷新

转载 作者:行者123 更新时间:2023-11-28 21:03:02 25 4
gpt4 key购买 nike

我有 UITableView 和 CustomCell。在 CustomCell 中有带有 CustomUICollectionViewCell 的 UICollectionView。一切都是按照UICollectionView inside CustomTableCell的方式创建的.然后,假设我有 12 行。一开始我可以看到其中的 6 个。在 CustomUICollectionViewCell 中,标签很好,但是当我向下滚动以查看其他单元格时,CustomUICollectionViewCells 标签与预期不符。它们与前 6 行相同,现在向上滚动。

滚动后我应该在哪里刷新 CustomUICollectionViewCells 标签?

示例 View :滚动前: enter image description here

滚动后: enter image description here

但是在调试时,将数据分配给单元格时,一切都分配得很好。所有代码都在链接中,因为这也是我的问题。似乎它在重复行。我想应该重新加载它(?)。

按照建议添加了 prepareForReuse 方法,但没有帮助。现在我的 CustomCellClass 看起来是:

@implementation TemperatureTableViewCell

NSNumberFormatter *decimalStyleFormatter;

- (void)awakeFromNib
{
[super awakeFromNib];
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];

[flowLayout setItemSize:CGSizeMake(50, 50)];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
self.collectionView = [[CollectionView alloc] initWithFrame: CGRectZero collectionViewLayout:flowLayout];
[self.collectionView registerClass:[TemperatureItemCollectionViewCell class] forCellWithReuseIdentifier:@"TemperatureItemCollectionCell"];
self.collectionView.showsHorizontalScrollIndicator = NO;
self.collectionView.dataSource = self;
self.collectionView.delegate = self;

[self.contentView addSubview:self.collectionView];

}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return self.collection.count;
}

-(void)collectionView:(CollectionView *)collectionView willDisplayCell:(TemperatureItemCollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
TemperatureSensor *temp = self.collection[indexPath.item];
cell.temperatureValue = temp.temperature.stringValue;
cell.tempValTempCollViewCell.text = [NSString stringWithFormat:@"%@°C", cell.temperatureValue];
cell.sensorName.text = temp.sensorName;
cell.imageTempCollViewCell.image = [TemperatureImageHelper getTemperatureIcon:temp];
[self.collectionView reloadData];
}

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

- (void)setCollectionViewDelegate:(id)dataSourceDelegate indexPath:(NSIndexPath *)indexPath {
self.collectionView.delegate = dataSourceDelegate;
}

@end

还有我的 CustomCollectionViewCell:

@implementation TemperatureItemCollectionViewCell
-(void)awakeFromNib {
[super awakeFromNib];

}
-(void)prepareForReuse {
[super prepareForReuse];

self.imageTempCollViewCell.image = nil;
self.tempValTempCollViewCell.text = nil;
self.sensorName.text = nil;
self.temperatureValue = nil;

}
@end

我的 TableView Controller

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (_tempSensorsDictionary == nil)
return 0;
else {
NSArray *allSensorKeys = [_tempSensorsDictionary allKeys];
return [allSensorKeys count];
}
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(TemperatureTableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setCollectionViewDelegate:self indexPath:indexPath];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {

NSArray *nodeNumbers = [_tempSensorsDictionary allKeys];
TemperatureTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath: indexPath];
cell.collection = [_tempSensorsDictionary objectForKey:nodeNumbers[indexPath.row]];
//NSArray *nodeNumbers = [_tempSensorsDictionary allKeys];
if([[UnitNameCache sharedUnitNameCache] getNameForId:nodeNumbers[indexPath.row]] != nil &&
![[[UnitNameCache sharedUnitNameCache] getNameForId:nodeNumbers[indexPath.row]] isEqualToString:@""]) {
NSString *name = [NSString stringWithFormat:@"%@ (%@)", [[UnitNameCache sharedUnitNameCache] getNameForId:nodeNumbers[indexPath.row]], nodeNumbers[indexPath.row]];
cell.unitNameLabel.text = name;
} else {
cell.unitNameLabel.text = nodeNumbers[indexPath.row];
}
return cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 85.0;
}

最佳答案

因为 UITableViewCells 被重用以提高性能,所以有时会发生缓存。在您的 TemperatureTableViewCell 类中,您应该覆盖 prepareForReuse 并重置其属性。在您的情况下,您应该清除填充它的数据。我还会将 prepareForReuse 保留在 TemperatureItemCollectionViewCell 中,以避免出现更多问题。

- (void)prepareForReuse
{
[super prepareForReuse];

//Reset properties here.
self.collection = nil;
[self.collectionView reloadData];
}

关于ios - 滚动时 UITableView 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47331088/

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