UIStoryboard 中的自定义原型单元已创建,但未显示在 UITableView
Posted
技术标签:
【中文标题】UIStoryboard 中的自定义原型单元已创建,但未显示在 UITableView【英文标题】:Custom prototype cell in UIStoryboard is created but doesn't show up in UITableView 【发布时间】:2015-01-22 08:48:59 【问题描述】:我有一个项目需要使用自定义 UITableViewCell。我正在将单元设计为故事板中的原型,在那里看起来很好。我将原型分配给我的自定义 UITableViewCell 子类,为其提供与我在 UITableView 中使用的相同的重用标识符,并将原型单元格上的 UILabel 链接到我的 UITableViewCell 子类中的 IBOutlet。
当我从 UITableView 调用它时,单元格被创建,如果我在该类的代码中添加标签和按钮(使用 CGRect 和所有创建它们)它们都可以工作,但我在情节提要中添加的标签永远不会出现。
我不明白如何成功调用和创建我的子类,但就我的应用而言,它的布局和情节提要中的子视图似乎不存在。我做错了什么?
这是我的 cellForRowAtIndexPath 代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
// Configure the cell...
return cell;
【问题讨论】:
你能把你的 cellForRowAtIndexPath 代码伴侣吗? 你最好推荐appcoda.com/customize-table-view-cells-for-uitableview。这可能会对您有所帮助。 @iosNoob 我用代码编辑了这个问题。另外,当我在发布之前寻求帮助时,我找到了该链接并点击了它,但我仍然遇到这个问题,不知道为什么。 你使用的是xib还是storyboard? @iOSNoob Storyboard 和 UITableViewCell 子类。我创建了一个新项目只是为了测试这一点,这就是代码如此之少的原因。我创建了情节提要,正确设置(据我所知)并且正在使用我的子类,但是当我运行它时,我放在情节提要上的任何东西都没有出现在模拟器中。 【参考方案1】:我之前遇到过这个问题,在我的例子中,问题在于视图控制器的自动生成代码包含对以下内容的调用:
[UITableView registerClass:forCellReuseIdentifier:]
我建议检查并删除对上述内容的任何调用,或对
[UITableView registerNib:forCellReuseIdentifier:]
并再次尝试您的原始代码。
【讨论】:
我不知道你是怎么想出来的,但这正是我需要的。非常感谢!【参考方案2】:acreichman,在 cellForRow 中添加强制转换并在你的单元格的 awakeFromNib 中放置一个 NSLog,看看你是否到达那里。让我知道...
【讨论】:
我添加了演员表并将 NSLog 放入 awakeFromNib 中,但都没有解决我的问题,并且 NSLog 从未出现在日志中。但我也没有使用笔尖,我在情节提要中完成了这一切。我在我的 UITableViewCell 子类 initWithStyle 中放置了一个 NSLog,它确实显示在日志中,所以我知道它正在调用正确的类,即使我将原型单元类设置为我的自定义类,它也没有从情节提要中提取任何内容 @acreichman initWithStyle 不会被调用,因为您在情节提要中设置它,awakeFromNib 会。您应该仔细检查 ReuseIdentifier 和类是否设置正确(并且选择了单元格,而不是 contentView),并且在 cellForRow 中您正在处理正确的标识符......只要确保它应该工作。跨度> 【参考方案3】:您的cellForIndexViewPath
应如下所示,以创建带有标签的简单custom cell
,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *simpleTableIdentifier = @"SimpleTableCell";
SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
cell.nameLabel.text = [tableData objectAtIndex:indexPath.row];
return cell;
确保你已经做好所有连接,将datasource
和delegate
设置为table
,然后在“属性检查器”中将custom cell
的“标识符”设置为“MyTableViewCell”,如下所示,
故事板:
如上图所示,添加“MyTableViewCell”而不是“SimpleTableCell”。
【讨论】:
你可以为故事板而不是笔尖修改这个吗?在我的故事板中,单元格上有一个标签,但它没有显示我在故事板中设置的文本或我在 cellForRowAtIndexPath 中设置的任何自定义文本。该标签永远不会出现在模拟器中。 在 MyTableViewCell 类中与标签建立连接,然后将其访问到 cellForIndexViewPath。由于上面代码中的 nameLabel 是我在 SimpleTableCell 类中的标签。 两者都做了,并确保我的标识符和连接都是正确的,但仍然没有。我不知道为什么这不起作用。 @acreichman:检查 MyTableViewCell 视图中的类。单击 MyTableViewCell 视图,然后将此自定义类设置为 MyTableViewCell。 我从一开始就设置了这个设置,以及从我的原型上的标签到我的子类中的 UILabel 的连接,并且原型上的重用标识符与我的相同在 cellForRowAtIndexPath 中使用。一定有一些明显的东西我错过了,但我不知道它是什么。以上是关于UIStoryboard 中的自定义原型单元已创建,但未显示在 UITableView的主要内容,如果未能解决你的问题,请参考以下文章
使用从 Storyboard 定义的自定义 UITableViewController 和原型单元进行随机 UI 更新