我目前正在开发一个应用程序,其中包含基于JSON的设备列表,并为特定设备类型创建了一些自定义单元格。我的代码对设备进行了很好的排序,并将单元格的标签设置为设备名称,我已经检查过了。 cellIdentifier也是正确的。我的表视图包含来自类ZWDeviceItem的单元格,因此它应该正确加载,因为像ZWDeviceItemSwitch这样的所有类都是子类。我通过NIB加载自定义单元格。
我的问题是,在您选择特定行之前,这些自定义单元格中的标签是不可见的。我为我的tableview设置了IBOutlets,并将标签链接到自定义单元格。单元格高度绰绰有余,当我选择一行时,一切都正确显示。
设置设备类型的代码:
@class ZWDevice;
@interface ZWDeviceItem : UITableViewCell
@property (strong, nonatomic) IBOutlet UIImageView *refreshingImage;
@property (strong, nonatomic) IBOutlet UILabel *nameView;
- (void)setDisplayName:(ZWDevice*)device;
@end
#import "ZWDeviceItem.h"
#import "ZWDevice.h"
@implementation ZWDeviceItem
@synthesize nameView = _nameView;
@synthesize refreshingImage = _refreshingImage;
- (void)setDisplayName:(ZWDevice *)device
{
NSDictionary *dict = device.metrics;
self.nameView.text = [dict valueForKey:@"title"];
}
@end
选择要加载哪个NIB的代码:
- (ZWDeviceItem*)createUIforTableView:(UITableView *)tableView atPos:(NSIndexPath *)indexPath
{
ZWDeviceItem *item = [tableView dequeueReusableCellWithIdentifier:_deviceType];
if (item == nil)
{
if ([_deviceType isEqualToString:@"probe"])
//this method returns the NIB
item = [ZWDeviceItemDimmer device];
else if ([_deviceType isEqualToString:@"switchBinary"])
item = [ZWDeviceItemSwitch device];
else if ([_deviceType isEqualToString:@"switchMultilevel"])
item = [ZWDeviceItemSensorMulti device];
else if ([_deviceType isEqualToString:@"thermostat"])
item = [ZWDeviceItemThermostat device];
else if ([_deviceType isEqualToString:@"battery"])
item = [ZWDeviceItemBattery device];
else if ([_deviceType isEqualToString:@"fan"])
item = [ZWDeviceItemSensorBinary device];
else
item = [[ZWDeviceItem alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:_deviceType];
}
return item;
}
最后但并非最不重要的是我在UIViewController中的CellForRowIndexPath方法(是的,我已将ViewController设置为委托和数据源):
- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
ZWDevice *device = [objects objectAtIndex:indexPath.row];
ZWDeviceItem *cell = [device createUIforTableView:tableView atPos:indexPath];
[cell setDisplayName:device];
return cell;
}
我非常感谢这个问题的帮助!我查了几个类似的问题,但还没有解决它。大多数答案告诉我检查链接,但工作正常。
如果您需要任何进一步的信息,请告诉我,我会提供。
提前致谢!
以下是模拟器的截图: Images
对不起那些想过认真解决方案的人。
答案 0 :(得分:0)
你在这里有这一行:
ZWDeviceItem *item = [tableView dequeueReusableCellWithIdentifier:_deviceType];
这将始终返回有效项目,如果无法返回有效项目,则创建一个有效项目。并且在设置它之前使用_deviceType,所以它使用之前设置的值。