tidak dapat membatalkan antrean sel dengan pengenal Sel - harus mendaftarkan ujung atau kelas untuk pengenal atau menghubungkan sel prototipe di papan cerita


114

Saya cukup baru dalam pengkodean secara umum dan benar-benar baru mengenal Xcode (Swift). Saya memahami bahwa saya perlu mendaftarkan ujung pena atau kelas tetapi saya tidak mengerti 'di mana atau bagaimana?'.

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
Hati-hati dengan "Restoration ID" yang membingungkan - yang bukan apa-apa! Klik tab KEEMPAT di kanan atas, BUKAN tab KETIGA !!
Fattie

Jawaban:


82

Sudahkah Anda menyetel pengenal Sel Tabel ke "Sel" di papan cerita Anda?

Atau sudahkah Anda menetapkan kelas untuk UITableViewControllerkelas Anda dalam adegan itu?


102

Anda dapat mendaftarkan kelas untuk Anda UITableViewCellseperti ini:

Dengan Swift 3+:

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

Dengan Swift 2.2:

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

Pastikan pengenal yang sama " cell" juga disalin di papan cerita Anda UITableViewCell.

" self" adalah untuk mendapatkan kelas, gunakan nama kelas yang diikuti dengan .self.


1
Di mana kamu meletakkan ini?
RJB

7
di viewDidLoad()
Mette

18
Jika Anda menggunakan xib di sel khusus Anda, Anda harus mendaftarkannya seperti ini:tableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
atulkhatri

solusi cepat 3+ di atas bekerja untuk saya dalam 5 cepat
Mike Volmar

38

Ini berhasil untuk saya, Semoga membantu Anda juga:

Swift 4+:

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

Cepat 3 :

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

Swift 2.2 :

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

Kita harus mengatur properti Identifier ke Table View Cell seperti gambar di bawah ini,

masukkan deskripsi gambar di sini


1
Sangat sederhana :-)
Luc-Olivier

1
itu berhasil! Saya mengatur ID di idendity inspector tetapi menempelkannya di inspektur atribut berhasil untuk saya
Fato

1
Tuhan memberkati Anda! Menyelamatkan beberapa seumur hidup saya
Ragen Dazs

26

Saya mengalami masalah ini hari ini yang diselesaikan dengan memilih Produk -> Bersihkan. Saya sangat bingung karena kode saya benar. Masalahnya dimulai dari terlalu sering menggunakan command-Z :)


1
Serius menghabiskan lebih dari satu jam mencoba men-debug ini. Terima kasih :)
ewakened

Tentu saja ini bekerja dalam kombinasi dengan menentukan pengenal di papan cerita (lihat jawaban berikutnya)
Nech

21

y kasus saya, saya menyelesaikan ini dengan menamainya di properti "Identifier" dari Sel Tampilan Tabel:

masukkan deskripsi gambar di sini

Jangan lupa: untuk mendeklarasikan di Kelas Anda: UITableViewDataSource

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

gambar ini tidak cocok tetapi memberi sedikit petunjuk.
Martian2049

itu sedikit ketinggalan jaman hanya
Martian2049

13

Cukup seret sel (seperti yang Anda lakukan untuk TableViewController) dan tambahkan ke dalamnya hanya dengan melepaskan sel di TableViewController. Klik pada sel dan. Pergi ke inspektur atributnya dan setel pengenalnya sebagai "Sel". Semoga berhasil.


Jangan lupa Anda menginginkan Identifier pada Attributes Inspector .

( BUKAN "ID Pemulihan" pada "Inspektur Identitas"!)


6
Hati-hati dengan "Restoration ID" yang membingungkan - yang bukan apa-apa! Klik tab KEEMPAT di kanan atas, BUKAN tab KETIGA !!!
Fattie

9

Satu lagi alasan mengapa masalah ini terjadi adalah masalah sebelumnya. Saat menampilkan ViewController baru, membuat instance ViewController target secara langsung tentu saja tidak akan memuat sel prototipe dari StoryBoard. Solusi yang benar harus selalu memberi contoh pengontrol tampilan melalui papan cerita seperti ini:

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

Iya!! Itu benar!! Ini terjadi pada saya karena saya beralih ke ViewController yang terletak di Storyboard berbeda hanya dengan: self.present (MyViewController, animasi: false, penyelesaian: nil). Dan sepertinya itu benar-benar tidak mengunduh prototipe! Saya sudah mencoba untuk memulai dengan MyViewController secara langsung dan berfungsi dengan benar! Ini juga berfungsi saat saya mendaftarkan NIB untuk sel saya di viewDidLoad target ViewController.
Vitya Shurapov

7

Cocokkan nama pengenal di kedua tempat

Kesalahan ini terjadi ketika nama pengenal Tablecell berbeda di file Swift dan Storyboard.

Misalnya, pengenalnya adalah placecellIdentifier dalam kasus saya.

1) File Swift

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

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

    // Your code 

    return cell
}

2) Papan Cerita

masukkan deskripsi gambar di sini


5

Di Swift 3.0, daftarkan kelas untuk UITableViewCell Anda seperti ini:

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

2

Saya memiliki masalah yang sama. Masalah ini berhasil untuk saya. Di storyboard, pilih tampilan tabel Anda dan ubah dari sel statis menjadi sel dinamis.


2

Jika Anda menentukan sel Anda melalui Pembuat Antarmuka, dengan menempatkan sel di dalam UICollectionView, atau UITableView:

Pastikan Anda mengikat sel dengan kelas sebenarnya yang Anda buat, dan yang sangat penting, Anda mencentang "Wariskan modul dari target"


2

Dulu bekerja pada swift 3 dan swift 4 tetapi sekarang tidak berfungsi.

Suka

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

Jadi saya telah mencoba sebagian besar solusi yang disebutkan di atas dalam 5 cepat tetapi tidak berhasil.

Akhirnya saya mencoba solusi ini dan berhasil untuk saya.

override func viewDidLoad() 
{

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

2

Masalah saya adalah saya mendaftarkan sel tampilan tabel di dalam antrian pengiriman secara asynchronous. Jika Anda telah mendaftarkan sumber tampilan tabel dan mendelegasikan referensi di storyboard, maka antrian pengiriman akan menunda pendaftaran sel karena namanya akan terjadi secara asinkron dan tampilan tabel Anda mencari sel.

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

Anda sebaiknya tidak menggunakan antrean pengiriman untuk pendaftaran ATAU lakukan ini:

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

1

Saya baru saja bertemu masalah yang sama dan melihat posting ini. Bagi saya itu karena saya lupa set pengenal sel, juga seperti yang disebutkan dalam jawaban lain. Yang ingin saya katakan adalah jika Anda menggunakan storyboard untuk memuat sel khusus, kita tidak perlu mendaftarkan sel tampilan tabel dalam kode, yang dapat menyebabkan masalah lain.

Lihat posting ini untuk detailnya:

Sel tampilan tabel kustom: Label IBOutlet nol


0

Hanya untuk teman-teman baru iOS (seperti saya) yang memutuskan untuk memiliki banyak sel dan dalam file xib yang berbeda, solusinya bukanlah memiliki pengenal tetapi melakukan ini:

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

di sini newsDetails adalah nama file xib.


0

Cepat 5

Anda perlu menggunakan metode UINib untuk mendaftarkan sel di 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")
}

0

Di bidang “Subkelas”, pilih UITableViewController.

Judul kelas berubah menjadi xxxxTableViewController. Biarkan apa adanya.

Pastikan opsi "Buat juga file XIB" dipilih.


0

Saya menemukan pesan ini ketika UITableView di IB dipindahkan ke subview lain dengan Cmd-C - Cmd-V.

Semua pengenal, metode delegasi, tautan di IB, dll. Tetap utuh, tetapi pengecualian dimunculkan pada saat runtime.

Satu-satunya solusi adalah menghapus semua tinta, terkait dengan tampilan tabel di IB (outlet, sumber data, delegasi) dan membuatnya lagi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.