【问题标题】:Getting nil from dequeueReusableCellWithIdentifier从 dequeueReusableCellWithIdentifier 获取 nil
【发布时间】:2015-12-15 02:26:59
【问题描述】:

我正在使用情节提要来显示我的 TableViewController,而且我对为此使用情节提要非常陌生,我通常以编程方式完成所有操作。所以我遇到了一些问题。我使用以下代码导航到情节提要:

let registerTableViewController = RegisterTableViewController()
navigationController?.pushViewController(registerTableViewController, animated: true);

简单的两条线,这可能是我的问题,我不能 100% 确定这是您以编程方式移动到情节提要场景的方式,但是当我的所有视图都以编程方式布置时,我总是这样做的,所以让我知道这是否是问题的根源。

现在,我的 tableView 有一个单元格,重用标识符为 profileInfoCell。我已经把它放到一个常量文件中,所以我知道我得到了正确的。这是我非常简单的cellForRowAtIndexPath: 方法:

override func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(Constants.Registration.profileInfoCellIdentifier)

    return cell!
}

问题是cell 被返回为零。由于我使用的是故事板,我认为我的设置有问题,这就是为什么我认为我可能会以错误的方式移动到这个场景。如果您需要任何其他信息,请告诉我!

编辑:我没有使用静态 tableView 单元格。它们是原型细胞。

【问题讨论】:

  • 可以给tableviewcell截图吗?
  • 您要截屏 tableviewcell 的哪些部分? @Benoit 我已经相应地编辑了我的帖子,我的单元格是原型单元格,而不是静态单元格,所以我需要将它们出列。
  • @BillL 您给出了带有该单元格标签标识符的单元格屏幕截图。我想也许你没有设置标识符或从 tableview 到控制器的一些出口。
  • 错过了,我的错!撤回我的投票结束。

标签: ios swift uitableview


【解决方案1】:

是的,您错误地实例化了视图控制器。通过像你一样创建它,它完全是程序化的,因此完全绕过了故事板

确保您需要在情节提要中为视图控制器场景提供一个标识符。

假设:

  • 故事板文件名:“Main.storyboard”
  • 视图控制器场景标识符:“RegisterTableViewController”

Objective-C

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
RegisterTableViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"RegisterTableViewController"];
[self presentViewController:viewController animated:YES completion:nil];

斯威夫特

let storyboard = UIStoryboard.init(name: "Main",bundle:nil)
let viewController = storyboard.instantiateViewControllerWithIdentifier("RegisterTableViewController")
self.presentViewController(viewController, animated: true, completion: nil)

【讨论】:

  • 好的,故事板还是很新的,所以请耐心等待...我对界面构建器不太熟悉。故事板名称是文件名,还是故事板 ID?我在哪里可以找到视图控制器标识符?有人告诉我它在捆绑包中找不到故事板。
  • 我刚刚添加了一个屏幕截图,以显示您可以在哪里设置标识符。另外,刚刚意识到我的帖子中有错字。初始化对象时不要附加“.storyboard”,如果是“Main.storyboard”,只需简单地通过“Main”引用它
【解决方案2】:

这就是我的实现方式

override func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCellWithIdentifier(Constants.Registration.profileInfoCellIdentifier)

   if (cell == nil) {
       cell = RegisterTableViewController(style: UITableViewCellStyle.Default, reuseIdentifier:Constants.Registration.profileInfoCellIdentifier)        
   }

   return cell!
}

【讨论】:

    【解决方案3】:

    您在创建视图控制器时并没有引用故事板,因此不会应用故事板场景中的任何配置。

    您需要使用场景标识符从情节提要中检索视图控制器实例。比如:

    let storyboard = UIStoryboard.init(name: "Main",bundle:nil)
    let vc=storyboard.instantiateViewControllerWithIdentifier("sceneIdentifier")
    self.presentViewController(vc, animated: true, completion: nil)
    

    您需要在 Interface Builder 检查器中设置场景的 Storyboard ID。选择场景根部的橙色“View Controller”对象,然后在右侧的检查器中输入您的标识符:

    【讨论】:

    • 好的,故事板还是很新的,所以请耐心等待...我对界面构建器不太熟悉。故事板名称是文件名,还是故事板 ID?我在哪里可以找到视图控制器标识符?我被告知它在捆绑包中找不到故事板。 (与上述相同的评论)
    猜你喜欢
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多