gpt4 book ai didi

ios - 从多个线程更新 UITableViewCell 中的标签

转载 作者:行者123 更新时间:2023-11-28 22:00:13 25 4
gpt4 key购买 nike

从多个设备获取数据后,我正在重新加载 tableview,但 tableview 正在闪烁标签。例如,tableview 中的两行各包含两个标签。当我调用 reload tableview 时,显示第一行和第二行的数据将为空,显示第二行时,第一行将为空。就像它在闪烁,请帮助我如何解决这个问题

像这样我正在重新加载tableview

[devicesTableView performSelectorOnMainThread:@selector(reloadData)
withObject:nil
waitUntilDone:NO];

这是 CellForAtIndexPath 方法:

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

static NSString *simpleTableIdentifier = @"DeviceCustomTableViewCellIdentifier";

devicesCustomTableViewCell = (DeviceCustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (devicesCustomTableViewCell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DeviceCustomTableViewCell" owner:self options:nil];
devicesCustomTableViewCell = [nib objectAtIndex:0];
}

DeviceDetails *deviceDetailsEntity = [devicesArray objectAtIndex:indexPath.row];

devicesCustomTableViewCell.deviceName.text = deviceDetailsEntity.deviceLocalName;

for (int i=0; i<[dataArray count]; i++) {
DeviceParticulars *deviceParticulars = [dataArray objectAtIndex:i];
if ([[[deviceParticulars.peripheral identifier] UUIDString] isEqualToString:deviceDetailsEntity.deviceAddress]) {

devicesCustomTableViewCell.temperatureValueLabel.text = deviceParticulars.tempReadOutStr;



}

在此,DeviceDetails 类是核心数据类,因为我根据要求保存了 BLE 设备名称。

DeviceParticulars 类是 NSObject 类,用于保存来自多个 BLE 设备的数据,就像我从多个设备获取温度一样。我在 TableView 中显示温度值。

dataArray 是一个包含DeviceParticulars 对象的数组。

最佳答案

每次外围值发生变化时都重新加载整个表是昂贵的,并且如您所见,会产生视觉影响。

您可以更改自定义单元格以充当模型对象的委托(delegate) - DeviceParticulars

在您的 DeviceParticulars.h 文件中,注册委托(delegate)属性和协议(protocol)

@property (weak,nonatomic) id delegate;

@protocol DeviceParticularsDelegate
- (void)didUpdateDevice:(DeviceParticulars *)device;
@end

在您更新读数的 DeviceParticulars.m 文件中,调用

[self.delegate didUpdateDevice:self];

然后在您的 DeviceCustomTableViewCell.h 中,添加 <DeviceParticularsDelegate>到类定义并添加一个属性来存储您的 deviceParticulars

@property (strong,nonatomic) DeviceParticulars *myDevice;

在.m中实现委托(delegate)方法

-(void)didUpdateDevice:(DeviceParticulars *)device {
// Update cell labels as required
}

并实现prepareForReuse

- (void)prepareForReuse {
self.myDevice.delegate=nil; // Remove this cell as delegate for existing device;
}

最后,在您的 cellForRowAtIndexPath 中设置委托(delegate)

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

static NSString *simpleTableIdentifier = @"DeviceCustomTableViewCellIdentifier";

devicesCustomTableViewCell = (DeviceCustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (devicesCustomTableViewCell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DeviceCustomTableViewCell" owner:self options:nil];
devicesCustomTableViewCell = [nib objectAtIndex:0];
}

DeviceDetails *deviceDetailsEntity = [devicesArray objectAtIndex:indexPath.row];

devicesCustomTableViewCell.deviceName.text = deviceDetailsEntity.deviceLocalName;

for (int i=0; i<[dataArray count]; i++) {
DeviceParticulars *deviceParticulars = [dataArray objectAtIndex:i];
if ([[[deviceParticulars.peripheral identifier] UUIDString] isEqualToString:deviceDetailsEntity.deviceAddress]) {

deviceParticulars.delegate=deviceCustomTableViewCell; //Set the delegate
devicesCustomTableViewCell.myDevice=deviceDetails; //Set device property

devicesCustomTableViewCell.temperatureValueLabel.text = deviceParticulars.tempReadOutStr;


}

关于ios - 从多个线程更新 UITableViewCell 中的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25366538/

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