Objective c 为什么自定义单元格的标签仅在选定行时显示?

Objective c 为什么自定义单元格的标签仅在选定行时显示?,objective-c,uitableview,Objective C,Uitableview,我目前正在开发一个应用程序,其中有一个基于JSON的设备列表,并为特定设备类型创建了一些自定义单元格。我的代码对设备进行了分类,并将单元格的标签设置为设备名称,我已经检查过了。单元格标识符也是正确的。我的表视图包含一个来自类ZWDeviceItem的单元格,因此它应该正确加载,因为像ZWDeviceItemSwitch这样的所有类都是子类。我通过笔尖加载自定义单元格 我的问题是,在选择特定行之前,这些自定义单元格中的标签不可见。我为我的tableview设置了IBOutlets,并将标签链接到自

我目前正在开发一个应用程序,其中有一个基于JSON的设备列表,并为特定设备类型创建了一些自定义单元格。我的代码对设备进行了分类,并将单元格的标签设置为设备名称,我已经检查过了。单元格标识符也是正确的。我的表视图包含一个来自类ZWDeviceItem的单元格,因此它应该正确加载,因为像ZWDeviceItemSwitch这样的所有类都是子类。我通过笔尖加载自定义单元格

我的问题是,在选择特定行之前,这些自定义单元格中的标签不可见。我为我的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;
}
我真的很感激你能帮我解决这个问题!我查找了几个类似的问题,但还无法解决。大多数答案都告诉我检查链接,但效果很好

如果你需要任何进一步的信息,让我知道,我会提供它

提前谢谢

编辑: 以下是模拟器的屏幕截图:

编辑:已解决 看来我太蠢了,不适合做这件事。解决方案是将笔尖中的文本颜色设置为与白色不同的颜色…我将其设置为深色文本颜色,现在它可以立即漂亮地显示出来


很抱歉你们想到了一个严肃的解决方案。

这里有一句话:

ZWDeviceItem *item = [tableView dequeueReusableCellWithIdentifier:_deviceType];

这将始终返回一个有效项,如果无法返回,则创建一个有效项。它在设置之前使用了_deviceType,因此它使用了之前设置的值。

发布所选cellI的屏幕截图,我也会质疑你的设计。你有一个模型对象设备负责创建一个tableview单元格——这实际上是Cocoa和Cocoa Touch使用的MVC中控制器的工作。我测试了你的建议,但不是这样。您是对的,ifitem==nil是不必要的,但其余的都可以正常工作。我为特定设备类型加载了正确的NIB。问题是笔尖中的标签虽然设置正确,但无法显示。无论如何,谢谢你的帮助!