从多个设备获取数据后,我正在重新加载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中显示Temp值。
dataArray 是一个包含 DeviceParticulars 对象的数组。
答案 0 :(得分:1)
尝试使用适用于iOS 6及更高版本的-dequeueReusableCellWithIdentifier:forIndexPath:
方法。如果没有可重复使用的单元格,它将自动实例化单元格,因此您不必检查单元格== nil。不确定是什么原因造成你的问题,但我认为值得尝试。
如果有帮助,请告诉我。
答案 1 :(得分:1)
每次外围价值变化时重新加载整个表格都很昂贵,正如您所看到的那样,会产生视觉影响。
您可以更改自定义单元格以充当模型对象的委托 - DeviceParticulars
在DeviceParticulars.h文件中,注册委托属性和协议
@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中实现委托方法
-(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
- (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;
}