来自故事板的原型单元不创建 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 添加插座?