来自故事板的原型单元不创建 UILabel 等

Posted

技术标签:

【中文标题】来自故事板的原型单元不创建 UILabel 等【英文标题】:Prototype cell from storyboard not creating UILabels, etc 【发布时间】:2013-05-12 03:22:13 【问题描述】:

我的问题与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 文档 - 但仍然遇到这个令人沮丧的问题..

其他人遇到过这个问题并解决了吗?

【问题讨论】:

如果你记录单元格,是不是说它是一个NewServerCell,而不是一个UITableViewCell? @rdelmar:是的,它是一个 NewServerCell,但它的所有属性(以及它的祖先 UITableViewCell 的属性)都是 nil 嗯....这种问题很难诊断,因为您所说的一切听起来都是正确的。您是否使用了任何一种注册方法(用于注册类或 nib)?如果单元格是在情节提要中制作的,则不应使用其中任何一个。除了 IBOutlets 之外,您的自定义单元代码中还有其他内容吗? @rdelmar:我尝试了使用和不使用registerClass forCellReuseIdentifier - 现在没有,也没有骰子。除了(连接的)IBOutlets之外,什么都没有 如果有可以发布项目的地方,我会看看,但正如我所说,如果没有实际看到项目,这些问题很难诊断。 【参考方案1】:

我今天在使用 Xcode 5 的故事板时遇到了这个问题。在拔掉几乎所有剩余的头发后,我注意到我在viewDidLoad 中调用了这个:

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

哎呀!在情节提要中使用原型单元时,不需要此行。故事板会自动为我配置这个。 SwitchTableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:@"Setting" forIndexPath:indexPath]; 工作正常,无需显式调用 registerClass::

问题仍然存在,为什么调用registerClass::会导致一些插座无法连接。

【讨论】:

我也绝望地把头发都拔了出来。你有没有发现为什么它 registerClass 会导致一些插座无法连接? Swift 发生在我身上。 先生,您是救命稻草! 这当然对我有用,@DefenestrationDay 你应该将此标记为已接受的答案。 谢谢。这很有帮助。 谢谢!我习惯于使用单独的 xib 设计自定义表格单元格,因此我将那行代码带到了基于故事板的单元格中。【参考方案2】:

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

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

【讨论】:

奇怪 - 肯定有一个标签与我使用的标签,但是当我将它转换回 cellForRowAtIndexPath 中的标签时 - 它是 nil.. 标签仍然为零。它应该是。我不知道为什么故事板不会初始化单元格内的标签 你在调用 register 方法吗?这将导致您的属性为零【参考方案3】:

这是最明显被忽略的原因(我一直都这样做!):

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

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view.
    _tableView.delegate = self;
    _tableView.dataSource = self;

【讨论】:

【参考方案4】:

希望您已经解决了这个问题。无论如何,由于我没有看到您的问题的直接答案,所以我将其写下来。

根据我在情节提要中使用自定义原型单元的经验,请同时提供 indexPath。使用以下方法:

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

代替这段代码:

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

更改此设置将很容易解决此问题。您将看到所有连接的标签和图像视图,它们的值在 tableview 上可见。

【讨论】:

【参考方案5】:

在这个问题上我的头太用力了。最后是我在 CustomUITableViewCell.h 文件中用retain 而不是strong 声明了我的IBOutlets。我想我需要对内存管理进行更多研究。

错误:

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

正确:

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

【讨论】:

【参考方案6】:

检查您如何初始化 TableViewController。 我遇到了同样的问题,然后我认为我没有正确引用我的 TableViewController。

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

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

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

希望对你有帮助

【讨论】:

【参考方案7】:

一些东西可以尝试:

听起来你知道自己在做什么,但我会提到显而易见的事情来提醒你。确保“name”属性设置为 IBOutlet。

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

只是为了排除故障,取出出队的东西 暂时试试吧。

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

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

【讨论】:

OP 正在使用情节提要,情节提要中没有 File's Owner 对象。【参考方案8】:

我也遇到了完全相同的问题(单元格中的标签是nil)。

我的补救措施是删除一个initWithCoder 方法,我在尝试其他内容时“意外”添加到表视图中。当单元格从情节提要启动时调用此方法。如果您覆盖它并且不注意自己启动其中的所有标签,您最终将得到nil 标签。

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

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

【讨论】:

以上是关于来自故事板的原型单元不创建 UILabel 等的主要内容,如果未能解决你的问题,请参考以下文章

故事板:如何向原型 UITableViewCell 添加插座?

带有故事板的自定义静态 TableView - 单元格背景

向 iOS 故事板添加比视图控制器尺寸更多的原型单元格?

来自故事板的 UITableView - 使用 UITableViewStyleGrouped 初始化

来自故事板的自定义 UIButton

如何重命名故事板并保留来自其他故事板的链接