web-dev-qa-db-ja.com

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

私はコーディング全般はかなり新しく、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)
      }
    }
  }

}
88
ShizukaNaHaji

ストーリーボードでTable Cell identifierを "Cell"に設定しましたか?

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

62
Race B

次のようにUITableViewCellのクラスを登録できます。

with Swift 3 +:

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

with Swift 2.2:

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

ストーリーボードのcellにも同じ識別子「UITableViewCell」がコピーされていることを確認してください。

self」は、クラスに.selfが続くクラス名を使用させるためのものです。

89
Aks

これは私のために働いた、あなたにも役立つかもしれません:

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

下の画像のように、テーブルビューセルにIdentifierプロパティを設定する必要があります。

enter image description here

26
Jaywant Khedkar

今日、この問題が発生しましたが、[製品]-> [クリーン]を選択して解決しました。私のコードが適切だったので、私はとても混乱しました。問題はcommand-Zの使用回数が多すぎることから始まりました:)

23
MacInnis

y私の場合、テーブルビューセルの「識別子」プロパティに名前を付けることでこれを解決しました。

enter image description here

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

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

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


Attributes InspectorIdentifierが欲しいことを忘れないでください。

NOT「Identity Inspector」の「復元ID」!)

8
LC 웃

この問題が発生するもう1つの理由は、以前の問題です。新しいViewControllerを表示する場合、ターゲットViewControllerを直接インスタンス化しても、もちろんStoryBoardからプロトタイプセルは読み込まれません。正しい解決策は常に、ストーリーボードを通じて次のようにView Controllerをインスタンス化することです。

storyboard?.instantiateViewController(withIdentifier: "some_identifier")
6
Peter Honeder

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

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

Interface Builderでセルを定義した場合、UICollectionViewまたはUITableView内にセルを配置します。

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

1
Scaraux

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

1
Reza Dehnavi

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

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

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

1
Maria Chen

static var identifier:String {return String(describing:self)}

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

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

複数のセルと異なるxibファイルを使用することにしたiOSの仲間(私のような)にとっては、解決策は識別子を持たずにこれを行うことです:

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

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

0
androCoder-BD

Swift 5

viewDidLoadでセルを登録するには、INibメソッドを使用する必要があります

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
swiftBoy

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

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

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

0

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

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

登録にディスパッチキューを使用しないでくださいORこれを行います:

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