Hücre tanımlayıcısına sahip bir hücre sırasından çıkarılamıyor - tanımlayıcı için bir uç veya sınıf kaydetmeli veya bir storyboard'daki bir prototip hücresine bağlanmalıdır


114

Genel olarak kodlama konusunda oldukça yeniyim ve Xcode (Swift) için gerçekten yeniyim. Bir ucu veya sınıfı kaydettirmem gerektiğini anlıyorum, ancak 'nerede veya nasıl?'

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
Hiçbir şey olmayan kafa karıştırıcı "Restorasyon Kimliği" ne dikkat edin! Sağ üstteki DÖRDÜNCÜ sekmeyi tıklayın, ÜÇÜNCÜ sekmeyi DEĞİL !!
Fattie

Yanıtlar:


82

Film şeridinizde Tablo Hücresi tanımlayıcısını "Hücre" olarak ayarladınız mı ?

Yoksa UITableViewControllero sahnedeki sınıfınız için sınıfı mı belirlediniz ?


102

Aşağıdaki UITableViewCellgibi bir sınıfa kaydolabilirsiniz :

Swift 3+ ile:

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

Swift 2.2 ile:

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

Aynı tanımlayıcının " cell" film şeridinize de kopyalandığından emin olun UITableViewCell.

" self", sınıfın sınıf adını ve ardından gelmesini sağlamak içindir .self.


1
Bunu nereye koyuyorsunuz?
RJB

7
in viewDidLoad()
Mette

18
Özel hücrenizde bir xib kullanıyorsanız, şu şekilde kaydettirmeniz gerekir:tableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
atulkhatri

yukarıdaki hızlı 3+ çözümü benim için hızlı 5'te çalıştı
Mike Volmar

38

Bu benim için çalıştı, size de yardımcı olabilir:

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

Tanımlayıcı özelliğini aşağıdaki resme göre Tablo Görünüm Hücresine Ayarlamalıyız ,

görüntü açıklamasını buraya girin


1
Çok basit :-)
Luc-Olivier

1
işe yaradı! Kimliği kimlik denetçisinde ayarlıyordum ancak öznitelik denetçisine yapıştırmak benim için çalıştı
Fato

1
Tanrı seni korusun! Hayatımın bir çiftini
kurtardı

26

Bugün bu sorunu yaşadım ve Ürün -> Temizle'yi seçerek çözdüm. Kodum doğru olduğundan kafam çok karıştı. Sorun, komut-Z'yi çok fazla kullanmaktan başladı :)


1
Bu hatayı gidermek için bir saatten fazla zaman harcadım. Teşekkür ederim :)
2016

Tabii ki, hikaye tahtasında tanımlayıcıyı tanımlamayla birlikte çalışır (sonraki cevaba bakın)
Nech

21

y benim durumum, bunu Table View Cell'in "Identifier" özelliğinde adlandırarak çözdüm:

görüntü açıklamasını buraya girin

Unutmayın: Sınıfınızda bildirmek için: UITableViewDataSource

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

bu resim uyumsuz ama biraz ipucu verdi.
Martian2049


13

Sadece bir hücreyi sürükleyin (TableViewController için yaptığınız gibi) ve hücreyi TableViewController üzerinde serbest bırakarak ekleyin. Hücreye tıklayın ve öznitelik denetçisine gidin ve tanımlayıcısını "Hücre" olarak ayarlayın. Umarım çalışır.


İstediğiniz unutma Tanıtıcısını üzerinde Müfettiş Özellikleri .

( "Kimlik Denetçisi" üzerindeki "Yenileme Kimliği" DEĞİL !)


6
Hiçbir şey olmayan kafa karıştırıcı "Restorasyon Kimliği" ne dikkat edin! Sağ üstteki DÖRDÜNCÜ sekmeyi tıklayın, ÜÇÜNCÜ sekmeyi DEĞİL !!!
Şişko

9

Bu sorunun oluşmasının bir nedeni daha eski bir sorundur. Yeni bir ViewController gösterilirken, hedef ViewController'ın doğrudan somutlaştırılması elbette StoryBoard'dan prototip hücrelerini yüklemeyecektir. Doğru çözüm, her zaman aşağıdaki gibi storyboard aracılığıyla görünüm denetleyicisini somutlaştırmak olmalıdır:

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

Evet!! Bu doğru!! Bu bana oldu çünkü farklı Storyboard'da bulunan ViewController'a sadece self.present (MyViewController, animated: false, complete: nil) ile geçtim. Ve prototipi gerçekten indirmiyor gibi görünüyor! Doğrudan MyViewController ile başlamayı denedim ve doğru çalışıyor! Ayrıca, hedef ViewController'ın viewDidLoad'undaki hücrem için NIB'yi kaydederken de çalışıyor.
Vitya Shurapov

7

Tanımlayıcı adını her iki yerde eşleştirin

Bu hata, Tablecell'in tanımlayıcı adı Swift dosyası ve The Storyboard'da farklı olduğunda ortaya çıkar.

Örneğin, benim durumumda tanımlayıcı placecellIdentifier'dır .

1) Swift Dosyası

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

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

    // Your code 

    return cell
}

2) Film Şeridi

görüntü açıklamasını buraya girin


5

Swift 3.0'da, UITableViewCell'iniz için aşağıdaki gibi bir sınıf kaydedin:

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

2

Ben de aynı sorunu yaşadım. Bu sorun benim için çalıştı. Film şeridinde tablo görünümünüzü seçin ve onu statik hücrelerden dinamik hücrelere değiştirin.


2

Hücrenizi Arayüz Oluşturucu aracılığıyla, cihazınızın içine bir hücre yerleştirerek tanımladıysanız UICollectionViewveyaUITableView :

Hücreyi oluşturduğunuz gerçek bir sınıfla bağladığınızdan ve "Modülü hedeften devral" seçeneğini işaretlediğinizden emin olun.


2

Eskiden hızlı 3 ve hızlı 4'te çalışıyordu ama şimdi çalışmıyor.

sevmek

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

Bu yüzden yukarıda bahsedilen çözümlerin çoğunu hızlı 5'te denedim ancak hiç şansım olmadı.

Sonunda bu çözümü denedim ve benim için çalıştı.

override func viewDidLoad() 
{

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

2

Benim sorunum, gönderim kuyruğunun içindeki tablo görünümü hücresini eşzamansız olarak kaydediyordum. Tablo görünümü kaynağını kaydettiyseniz ve film şeridinde temsilci referansı kaydettiyseniz, adın gösterdiği gibi gönderme kuyruğu hücrenin kaydını geciktirir ve tablo görünümünüz hücreleri arar.

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

Kayıt için gönderim kuyruğu kullanmamalısınız VEYA şunu yapın:

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

1

Aynı sorunla yeni tanıştım ve bu gönderiyi görüyorum. Benim için bunun nedeni, diğer yanıtlarda da belirtildiği gibi hücre tanımlayıcısını unutmuş olmamdır. Söylemek istediğim, özel hücreyi yüklemek için film şeridini kullanıyorsanız, tablo görünümü hücresini koda kaydetmemize gerek olmadığıdır, bu da başka sorunlara neden olabilir.

Ayrıntılar için bu gönderiye bakın:

Özel tablo görünümü hücresi: IBOutlet etiketi boş


0

Birden fazla hücreye ve farklı bir xib dosyasında olmaya karar veren iOS arkadaşları için yeni olanlar (benim gibi) için çözüm tanımlayıcıya sahip olmak değil, bunu yapmaktır:

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

burada haberlerDetaylar xib dosya adıdır.


0

Swift 5

Hücreyi viewDidLoad'a kaydetmek için UINib yöntemini kullanmanız gerekir

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

"Alt Sınıf" alanında, UITableViewController öğesini seçin.

Sınıf başlığı xxxxTableViewController olarak değişir. Olduğu gibi bırakın.

"Ayrıca XIB dosyası oluştur" seçeneğinin seçili olduğundan emin olun.


0

IB'deki UITableView, Cmd-C - Cmd-V ile başka bir alt görünüme taşındığında bu mesajla karşılaştım.

Tüm tanımlayıcılar, temsilci yöntemleri, IB'deki bağlantılar vb. Bozulmadan kalır, ancak çalışma zamanında istisna oluşur.

Tek çözüm, IB'deki (çıkış, veri kaynağı, temsilci) tablo görünümüyle ilgili tüm mürekkepleri temizlemek ve bunları yeniden yapmaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.