为什么自定义单元格的标签仅在选择行时出现?

时间:2014-01-21 12:50:16

标签: objective-c uitableview

我目前正在开发一个应用程序,其中包含基于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

编辑:解决了

嗯,好像,我对这个太傻了。解决方案是将NIB中的文本颜色设置为与白色不同的颜色...我将其设置为深色文本颜色,现在它立即显示并且非常精美。

对不起那些想过认真解决方案的人。

1 个答案:

答案 0 :(得分:0)

你在这里有这一行:

ZWDeviceItem *item = [tableView dequeueReusableCellWithIdentifier:_deviceType];

这将始终返回有效项目,如果无法返回有效项目,则创建一个有效项目。并且在设置它之前使用_deviceType,所以它使用之前设置的值。