故事板中的原型单元不能创建UILabels等

时间:2013-05-12 03:22:13

标签: ios objective-c uitableview storyboard

我的问题与this one非常相似 我在Interface Builder中使用故事板设计的自定义原型单元将所有内部对象设置为nil(未创建),因此当我尝试为它们分配值时,它们保持空白。

我正在使用Xcode 4.6.2,并在6.1 iPhone模拟器中运行代码。这就是我所做的:

  • 在界面构建器中设计了具有必要字段的原型单元格。
  • 在代码中为此自定义单元格创建了UITableViewCell的子类,然后将界面构建器中的单元格设置为此类型。
  • 控制 - 将字段拖动到.h文件中,该文件为我设置对象(UILabels等)。我将单元格的标识符设置为“serverNameCell”
  • 设置数据源&将表委托给表所在的Viewcontroller。
  • 将表与ViewControler
  • 中的表对象相关联

目前,该表格显示正确的部分数量和数量。行,但未设置单元格的值。

这是cellForRowAtIndexPath:(NSIndexPath *)indexPath代码:

NewServerCell *cell = [tableView dequeueReusableCellWithIdentifier:@"serverNameCell"];

我总是回到一个单元格,内存位置似乎可以用于有效对象。

但是当我尝试cell.name.text = [thisServer name];时,我发现cell.name标签总是为零 没有崩溃 - 但是我的领域没有被设置。

我已经检查了一百万次标识符是好的 - 它是! 我已经浏览了故事板中的自定义单元格的Apple文档 - 但仍然遇到了这个令人沮丧的问题..

其他人有这个,并解决了吗?

8 个答案:

答案 0 :(得分:23)

我今天在Xcode 5的故事板上遇到了这个问题。把几乎所有剩余的头发拉出后,我注意到我在viewDidLoad

中调用了这个

[self.tableView registerClass:[SwitchTableViewCell class] forCellReuseIdentifier:@"Setting"];

糟糕!在故事板中使用原型单元时,此行是不必要的。故事板会自动为我配置。 SwitchTableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:@"Setting" forIndexPath:indexPath];无需明确调用registerClass::即可正常工作。

问题仍然存在为什么调用registerClass::导致某些商店无法连接。

答案 1 :(得分:1)

解决此问题的一个简单方法是在原型中标记UILabel并使用以下方法对其进行操作:

UILabel* label = [cell viewWithTag:cellTag];
label.text = [thisServer name]

答案 2 :(得分:1)

这是最明显错过的原因(我一直这么做!):

您是否已将tableview的委托和数据源设置为控制器? (即自我)

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    _tableView.delegate = self;
    _tableView.dataSource = self;
}

答案 3 :(得分:1)

希望你已经解决了这个问题。无论如何,因为我没有看到你问题的直接答案,我写下来了。

根据我在故事板中使用自定义Prototype单元的经验,也提供indexPath。使用以下方法:

MyCustomCell *cell = (MyCustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CellIdentifier" forIndexPath:indexPath];

代替此代码:

NewServerCell *cell = [tableView dequeueReusableCellWithIdentifier:@"serverNameCell"];

更改此功能可以轻松解决此问题。您将在桌面视图中看到所有连接的标签和图像视图及其值。

答案 4 :(得分:1)

在这个问题上我的头很难受。结果是我在CustomUITableViewCell.h文件中用retain而不是strong声明我的IBOutlets。我想我需要更多地研究内存管理。

错:

@property (nonatomic, retain) IBOutlet UIImageView  *preview;

正确:

@property (nonatomic, strong) IBOutlet UIImageView  *preview;

答案 5 :(得分:1)

检查你是如何初始化TableViewController的。 我遇到了同样的问题,然后我发现我没有适当地引用我的TableViewController。

所以我必须在“pushViewController”之前更改我的代码。

而不是:[[TableViewController alloc]init] 使用:[self.storyboard instantiateViewControllerWithIdentifier:yourTableViewIdentifier]

并且不要忘记删除任何为您的tableview注册单元类的代码,例如:[self.tableView registerClass:[SwitchTableViewCell class] forCellReuseIdentifier:@"Setting"];

希望有所帮助

答案 6 :(得分:0)

尝试一些事情:

听起来你知道自己在做什么,但我会提到明显只是为了提醒你。确保“name”属性设置为IBOutlet。

  • 在IB中,您可以设置文件所有者的类类型,将此设置为 你的自定义类。

  • 为了排除故障,取出出队的东西 暂时尝试一下。

  • 尝试“名称”以外的其他属性名称我不相信“名称” 但是存在于基类中。

之前我遇到过类似的事情,这可能很简单。

答案 7 :(得分:0)

我也有完全相同的问题(标签在单元格中为nil)。

我的补救措施是删除initWithCoder方法,我意外地"尝试其他东西时添加到表视图中。当从故事板发起单元格时,将调用此方法。如果您覆盖它并且不打算自己启动其中的所有标签,那么您最终会得到nil标签。

因此,作为此症状的一个潜在错误:检查是否存在此方法。

-(id)initWithCoder:(NSCoder *)decoder {
    self = [self init];
    return self;
}