識別子Cellのセルをデキューできません-識別子のnibまたはクラスを登録するか、ストーリーボードのプロトタイプセルを接続する必要があります


113

私は一般的にコーディングにかなり慣れており、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)
      }
    }
  }

}

11
紛らわしい「Restoration ID」に気をつけてください。 3 番目のタブではなく、右上の4番目のタブをクリックします。
Fattie 2017年

回答:


82

ストーリーボードでテーブルセル識別子を「セル」に設定しましたか?

またはUITableViewController、そのシーンのクラスにクラスを設定しましたか?


102

次の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
これはどこに置くの?
RJB 2017

7
in viewDidLoad()
メット

18
:カスタムセル内のXIBを使用している場合、あなたはこのようにそれを登録する必要がありますtableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
atulkhatri

上記のSwift 3+ソリューションはSwift 5で私のために働きました
Mike Volmar

38

これは私のために働きました、あなたも助けるかもしれません:

Swift 4+:

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

スウィフト3

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

Swift 2.2

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

以下の画像のように、IdentifierプロパティをTable View Cell に設定する必要があります。

ここに画像の説明を入力してください


1
とてもシンプル:-)
Luc-Olivier

1
出来た!私はidendityインスペクタでIDを設定していましたが、それを属性インスペクタに貼り付けるとうまくいきました
Fato

1
神のお恵みがありますように!私の生涯のいくつかを保存しました
Ragen Dazs

26

今日私はこの問題を抱えていましたが、製品->クリーンを選択することで解決しました。コードが適切だったので、私はとても混乱していました。問題はcommand-Zを何度も使用することから始まりました:)


1
これをデバッグするために真剣に1時間以上費やしました。ありがとうございました:)
16年

もちろん、それはストーリーボードで識別子を定義することと組み合わせて機能します(次の回答を参照)
Nech

21

私のケースでは、テーブルビューセルの "Identifier"プロパティに名前を付けることでこれを解決しました。

ここに画像の説明を入力してください

忘れないでください:クラスで宣言する:UITableViewDataSource

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

この図は一致していませんが、いくつかのヒントを与えました。
Martian2049 2017

それは少し時代遅れなだけです
Martian2049

13

(TableViewControllerの場合と同様に)セルをドラッグし、TableViewControllerでセルを解放するだけでセルに追加します。セルをクリックして、その属性インスペクターに移動し、その識別子を「セル」として設定します。


あなたが望むことを忘れないでください識別子属性インスペクタを

(「IDインスペクタ」の「復元ID」ではありません!)


6
紛らわしい「Restoration ID」に気をつけてください。3番目のタブではなく、右上の4番目のタブをクリックします!!!
Fattie

9

この問題が発生するもう1つの理由は、以前の問題です。新しいViewControllerを表示するとき、ターゲットViewControllerを直接インスタンス化しても、StoryBoardからプロトタイプセルはロードされません。正しい解決策は常に、次のようにストーリーボードを介してビューコントローラをインスタンス化することです。

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

はい!!それは本当です!!self.present(MyViewController、animated:false、completion:nil)を使用して別のストーリーボードにあるViewControllerに移行したため、これは私に起こりました。そして、それは本当にプロトタイプをダウンロードしないようです!私は直接MyViewControllerから始めようとしましたが、正しく機能します!ターゲットのViewControllerのviewDidLoadでセルのNIBを登録しているときにも機能します。
Vitya Shurapov

7

両方の場所で識別子名を一致させる

このエラーは、Tablecellの識別子名がSwiftファイルとThe Storyboardで異なる場合に発生します。

たとえば、私の場合、識別子は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)ストーリーボード

ここに画像の説明を入力してください


5

Swift 3.0で、UITableViewCellのクラスを次のように登録します。

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

2

私も同じ問題を抱えていました。この問題は私にとってうまくいきました。ストーリーボードでテーブルビューを選択し、静的セルから動的セルに変更します。


2

Interface Builderを使用してセルを定義した場合は、内にセルを配置するUICollectionViewか、またはUITableView

セルを、実際に作成した実際のクラスにバインドしていることを確認してください。非常に重要なのは、「ターゲットからモジュールを継承する」をチェックしたことです。


2

以前は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")
}

2

私の問題は、ディスパッチキュー内のテーブルビューセルを非同期で登録していたことでした。ストーリーボードでテーブルビューのソースとデリゲートの参照を登録した場合、ディスパッチキューは、名前が非同期に発生し、テーブルビューがセルを探していることからわかるように、セルの登録を遅らせます。

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()
}

1

私は同じ問題に遭遇し、この投稿を参照しました。私にとっては、他の回答でも述べたように、セルの識別子のセットを忘れたためです。ストーリーボードを使用してカスタムセルを読み込む場合、テーブルビューセルをコードに登録する必要がないため、他の問題が発生する可能性があります。

詳細については、この投稿を参照してください。

カスタムテーブルビューセル:IBOutletラベルはnil


0

複数のセルと別のxibファイルを使用することを決定したiOSバディの初心者(私など)の場合、解決策は識別子を持たずにこれを行うことです。

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

ここnewsDetailsはxibファイル名です。


0

スウィフト5

あなたはviewDidLoadでセルを登録するためにUINibメソッドを使用する必要があります

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")
}

0

「のサブクラス」フィールドで、UITableViewControllerを選択します。

クラスのタイトルがxxxxTableViewControllerに変わります。そのままにしておきます。

「またXIBファイルを作成する」オプションが選択されていることを確認してください。


0

IBのUITableViewがCmd-C-Cmd-Vで別のサブビューに移動されたときに、このメッセージに遭遇しました。

すべての識別子、デリゲートメソッド、IB内のリンクなどはそのまま残りますが、実行時に例外が発生します。

唯一の解決策は、IBのテーブルビュー(アウトレット、データソース、デリゲート)に関連するすべてのインクをクリアして、再度作成することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.