无法使用标识符Cell将单元格出列 - 必须为标识符注册nib或类,或者在故事板中连接原型单元格

时间:2015-03-26 15:25:37

标签: ios swift iphone xcode6

我对编码很新,对Xcode(Swift)来说真的很新。我知道我需要注册一个笔尖或一个班级,但我不明白&在哪里或如何?'。

import UIKit

class NotesListViewController: UITableViewController {

    @IBOutlet weak var menuButton: UIBarButtonItem!

  override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self,
      selector: "preferredContentSizeChanged:",
      name: UIContentSizeCategoryDidChangeNotification,
      object: nil)

    // Side Menu

    if self.revealViewController() != nil {
        menuButton.target = self.revealViewController()
        menuButton.action = "revealToggle:"
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }

  }

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    // whenever this view controller appears, reload the table. This allows it to reflect any changes
    // made whilst editing notes
    tableView.reloadData()
  }

  func preferredContentSizeChanged(notification: NSNotification) {
    tableView.reloadData()
  }

  // #pragma mark - Table view data source

  override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
  }

  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return notes.count
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath   indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell

    let note = notes[indexPath.row]
    let font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
    let textColor = UIColor(red: 0.175, green: 0.458, blue: 0.831, alpha: 1)
    let attributes = [
      NSForegroundColorAttributeName : textColor,
      NSFontAttributeName : font,
      NSTextEffectAttributeName : NSTextEffectLetterpressStyle
    ]
    let attributedString = NSAttributedString(string: note.title, attributes: attributes)

    cell.textLabel?.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)

    cell.textLabel?.attributedText = attributedString

    return cell
  }

  let label: UILabel = {
    let temporaryLabel = UILabel(frame: CGRect(x: 0, y: 0, width: Int.max, height: Int.max))
    temporaryLabel.text = "test"
    return temporaryLabel
    }()

  override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    label.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
    label.sizeToFit()
    return label.frame.height * 1.7
  }

  override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
      notes.removeAtIndex(indexPath.row)
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
  }

  // #pragma mark - Navigation

  // In a storyboard-based application, you will often want to do a little preparation before navigation
  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if let editorVC = segue.destinationViewController as? NoteEditorViewController {

      if "CellSelected" == segue.identifier {
        if let path = tableView.indexPathForSelectedRow() {
          editorVC.note = notes[path.row]
        }
      } else if "AddNewNote" == segue.identifier {
        let note = Note(text: " ")
        editorVC.note = note
        notes.append(note)
      }
    }
  }

}

25 个答案:

答案 0 :(得分:87)

您可以为UITableViewCell注册一个课程:

使用Swift 3 +:

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

使用Swift 2.2:

self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

确保同样的标识符“cell”也会复制到故事板的UITableViewCell

self”用于让班级使用班级名称后跟.self

答案 1 :(得分:61)

您是否已将表格单元格标识符设置为" Cell"在你的故事板里?

或者您是否已将UITableViewController的班级设置为该场景中的班级?

答案 2 :(得分:26)

这对我有用,也可以帮助你:

Swift 4+:

self.tableView.register(UITableViewCell.self, forCellWithReuseIdentifier: "cell")

Swift 3

self.tableView.register(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell")

Swift 2.2

self.tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell")
  

我们必须将标识符属性设置为表视图单元格,如下图所示

enter image description here

答案 3 :(得分:23)

我今天遇到了这个问题,通过选择产品 - >解决了这个问题。清洁。因为我的代码是正确的,所以我很困惑。问题从使用命令-Z开始太多次了:)

答案 4 :(得分:17)

我的情况是通过在Table View Cell的“Identifier”属性中命名它来解决这个问题:

enter image description here

不要忘记:在你的类中声明:UITableViewDataSource

 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell

答案 5 :(得分:11)

在两个地方匹配标识符名称

在Swift文件和情节提要中Tablecell的标识符名称不同时,会发生此错误。

例如,在我的情况下,标识符为 placecellIdentifier

1)Swift文件

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "placecellIdentifier", for: indexPath)
    
    // Your code 

    return cell
}

### 2)故事板 enter image description here

答案 6 :(得分:8)

只需拖动一个单元格(就像你为TableViewController所做的那样)并通过释放TableViewController上的单元格来添加它。单击单元格并转到其属性检查器并将其标识符设置为“单元格”。希望它可以工作。


不要忘记属性检查器上需要标识符

NOT “身份检查员”中的“恢复ID”!)

答案 7 :(得分:5)

此问题发生的另一个原因是早期问题。在显示新的ViewController时,直接实例化目标ViewController当然不会从StoryBoard加载原型单元格。正确的解决方案应该始终是通过故事板实例化视图控制器,如下所示:

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

答案 8 :(得分:3)

在Swift 3.0中,为您的UITableViewCell注册一个类:

tableView.register(UINib(nibName: "YourCellXibName", bundle: nil), forCellReuseIdentifier: "Cell")

答案 9 :(得分:2)

愚蠢的错误:

确保添加register(TableViewCell.self, forCellReuseIdentifier: "Cell")而不是register(TableViewCell.self, forHeaderFooterViewReuseIdentifier: "Cell")

答案 10 :(得分:2)

有两种定义单元格的方法。如果您的表格单元格位于ViewControllern的内部,请通过以下方式获取该单元格:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
        // write your code here 
        return cell
}

但是,如果您在ViewController之外定义单元格,则可以通过以下方式调用Sell:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = Bundle.main.loadNibNamed("TableViewCell", owner: self, options: nil)?.first as! TableViewCell
        // write your code here
        return cell
    }

正如大家所说的,不要忘记设置您的单元格标识符:

enter image description here

答案 11 :(得分:1)

我刚遇到同样的问题,看到这篇文章。对我而言,因为我忘记了设置单元格的标识符,也像其他答案中提到的那样。我想说的是,如果您使用故事板加载自定义单元格,我们不需要在代码中注册表格视图单元格,这可能会导致其他问题。

有关详细信息,请参阅此帖:

Custom table view cell: IBOutlet label is nil

答案 12 :(得分:1)

我遇到了同样的问题。这个问题对我有用。在故事板中选择您的表格视图并将其从静态单元格更改为动态单元格。

答案 13 :(得分:1)

如果您通过界面生成器定义了单元格,则可以在UICollectionViewUITableView中放置一个单元格:

确保您使用您创建的实际课程绑定了单元格,并且非常重要,您已选中"从目标继承模块"

答案 14 :(得分:0)

如果经典解决方案(在代码或 IB 中为类注册标识符)不起作用:尝试重新启动 Xcode,结果我的故事板停止保存我所做的编辑,包括设置重用标识符。

答案 15 :(得分:0)

我也在同一个问题上挣扎。我实际上已经删除了该类并对其进行了重建。有人,情节提要断开了原型单元与标识符之间的链接。

我删除了标识符名称,然后再次输入了标识符名称。

有效。

答案 16 :(得分:0)

确保您的单元格标识符中填写的属性中具有标识符

答案 17 :(得分:0)

我遇到了同样的问题,我在 viewDidLoad() 中注册了我的自定义 UITableViewCell 类,这引发了这个错误。为了修复它,我所做的是在 didSet 属性观察器中注册单元格,如下所示

@IBOutlet tableview : UITableView! {
    didSet {
        tableview.register(CustomCell.self, forCellReuseIdentifier: "Cell")
    }
}

答案 18 :(得分:0)

当IB中的UITableView通过Cmd-C-Cmd-V移到另一个子视图时,我遇到了此消息。

IB中的所有标识符,委托方法,链接等均保持不变,但在运行时会引发异常。

唯一的解决方案是清除所有与IB中的表格视图相关的墨水(插座,数据源,委托),然后重新进行制作。

答案 19 :(得分:0)

静态var标识符:字符串{         返回字符串(描述:自我)     }

static var nib : UINib {
    return UINib(nibName: identifier, bundle: nil)
}

答案 20 :(得分:0)

在“子类”字段中,选择UITableViewController。

类标题更改为xxxxTableViewController。保持原状。

确保已选中“也创建XIB文件”选项。

答案 21 :(得分:0)

我的问题是我正在异步地在调度队列中注册表视图单元。如果您已在情节提要中注册了表格视图的源代码和委托引用,则调度队列将延迟单元的注册,因为名称表明它将异步发生,并且表格视图正在查找这些单元。

DispatchQueue.main.async {
    self.tableView.register(CampaignTableViewCell.self, forCellReuseIdentifier: CampaignTableViewCell.identifier())
    self.tableView.reloadData()
}

要么您不应该使用调度队列进行注册,要么这样做:

DispatchQueue.main.async {
    self.tableView.dataSource = self
    self.tableView.delegate = self
    self.tableView.register(CampaignTableViewCell.self, forCellReuseIdentifier: CampaignTableViewCell.identifier())
    self.tableView.reloadData()
}

答案 22 :(得分:0)

它曾经在swift 3和swift 4上工作,但现在不起作用。

喜欢

self.tableView.register(MyTestTableViewCell.self, forCellReuseIdentifier: "cell")

所以我在Swift 5中尝试了上面提到的大多数解决方案,但是没有任何运气。

最后,我尝试了此解决方案,它对我有用。

override func viewDidLoad() 
{

    tableView.register(UINib.init(nibName: "MyTestTableViewCell", bundle: nil), forCellReuseIdentifier: "myTestTableViewCell")
}

答案 23 :(得分:0)

快速5

您需要使用 UINib 方法在viewDidLoad中注册单元格

override func viewDidLoad() 
{
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    //register table view cell        
    tableView.register(UINib.init(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "CustomTableViewCell")
}

答案 24 :(得分:0)

对于刚决定使用多个单元并位于不同xib文件中的iOS伙伴(如我)而言,解决方案不是具有标识符,而是要执行以下操作:

let cell = Bundle.main.loadNibNamed("newsDetails", owner: self, options: nil)?.first as! newsDetailsTableViewCell

此处 newsDetails 是xib文件名。