繁体   English   中英

情节提要中的原型单元未创建UILabels等

[英]Prototype cell from storyboard not creating UILabels, etc

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

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

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

目前,表格中显示的分区和行数正确,但是未设置单元格的值。

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

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

我总是拿回一个单元格,对于有效的对象来说,内存位置似乎还可以。

但是当我尝试cell.name.text = [thisServer name]; 我发现cell.name标签始终为nil。
没有崩溃-但没有设置我的字段。

我已经检查了一百万次,确定标识符正确-是的! 我已经遍历了Apple文档中有关情节提要的自定义单元的内容-但仍然遇到了令人沮丧的问题。

还有其他人解决了吗?

今天,我在Xcode 5的故事板上遇到了这个确切的问题。 拔出几乎所有剩余的头发后,我注意到我在viewDidLoad中称呼它:

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

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

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

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

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

这是最明显的遗漏原因( 我一直都这样做! ):

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

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

希望您已经解决了此问题。 无论如何,由于我看不到您问题的直接答案,因此我将其写下来。

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

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

而不是此代码:

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

更改此设置将很容易解决此问题。 您将看到所有已连接的标签和图像视图,其值在表格视图中可见。

在这一个上,我的头太用力了。 结束了,我是说出我的IBOutlets有retain ,而不是strong在我CustomUITableViewCell.h文件。 我想我需要对内存管理进行更多研究。

错误:

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

正确:

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

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

因此,我必须在“ pushViewController”之前更改代码。

代替: [[TableViewController alloc]init]使用: [self.storyboard instantiateViewControllerWithIdentifier:yourTableViewIdentifier]

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

希望能帮助到你

一些可以尝试的东西:

听起来您知道自己在做什么,但我只想提醒您一点。 确保“名称”属性设置为IBOutlet。

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

  • 只是为了进行故障排除,请暂时取出出队的东西并尝试一下。

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

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

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

我的补救措施是删除尝试其他操作时“意外”添加到表视图的initWithCoder方法。 从情节提要中启动单元时,将调用此方法。 如果您覆盖它,而自己却不小心启动其中的所有标签,那么最终将得到nil标签。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM