पहचानकर्ता सेल के साथ एक सेल को समाप्त करने में असमर्थ - पहचानकर्ता के लिए एक निब या एक वर्ग पंजीकृत करना चाहिए या स्टोरीबोर्ड में एक प्रोटोटाइप सेल कनेक्ट करना चाहिए।


114

मैं सामान्य रूप से कोडिंग के लिए काफी नया हूं और वास्तव में Xcode (स्विफ्ट) के लिए नया हूं। मैं समझता हूं कि मुझे एक निब या कक्षा को पंजीकृत करने की आवश्यकता है, लेकिन मुझे यह समझ में नहीं आता है कि 'कहाँ या कैसे?'।

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
भ्रामक "बहाली आईडी" के लिए बाहर देखो - जो कुछ भी नहीं है! शीर्ष दाईं ओर स्थित फ़ुट टैब पर क्लिक करें , न कि थर्ड टैब !!
fattie

जवाबों:


82

क्या आपने टेबल सेल पहचानकर्ता को अपने स्टोरीबोर्ड में "सेल" पर सेट किया है ?

या आपने UITableViewControllerउस दृश्य में अपनी कक्षा के लिए कक्षा निर्धारित की है ?


102

आप UITableViewCellइस तरह से अपने लिए एक क्लास रजिस्टर कर सकते हैं :

स्विफ्ट 3+ के साथ:

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

स्विफ्ट 2.2 के साथ:

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

सुनिश्चित करें कि समान पहचानकर्ता " cell" आपके स्टोरीबोर्ड पर भी कॉपी किया गया है UITableViewCell

" self" कक्षा के नाम का उपयोग करने के लिए वर्ग प्राप्त करने के लिए है .self


1
आप इसे कहाँ लगाते हैं?
RJB

7
में viewDidLoad()
मेटे

18
यदि आप अपने कस्टम सेल में एक xib का उपयोग कर रहे हैं, तो आपको इसे इस तरह पंजीकृत करना होगा:tableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
atulkhatri

ऊपर दिए गए 3+ के समाधान में मेरे लिए 5
माइक वोल्मर

38

इसने मेरे लिए काम किया, आपकी भी मदद कर सकता हूं:

स्विफ्ट 4+:

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

स्विफ्ट 3 :

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

स्विफ्ट 2.2 :

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

हमें आइडेंटिफायर प्रॉपर्टी को इमेज के अनुसार टेबल व्यू सेल में सेट करना है,

यहां छवि विवरण दर्ज करें


1
बस इतना आसान :-)
ल्यूक-ओलिवियर

1
इसने काम कर दिया! मैं idendity निरीक्षक में आईडी की स्थापना की गई थी लेकिन विशेषता निरीक्षक मेरे लिए काम किया में चिपकाकर
Fato

1
भगवान आपका भला करे! मेरे जीवनकाल के एक जोड़े को बचा लिया
Ragen Dazs

26

मेरे पास आज यह मुद्दा था जो उत्पाद -> स्वच्छ का चयन करके हल किया गया था। मेरा कोड उचित होने के बाद से मैं बहुत उलझन में था। कमांड-जेड का उपयोग करने से समस्या कई बार शुरू हुई :)


1
इस पर डिबग करने की कोशिश में एक घंटे से अधिक समय व्यतीत किया। धन्यवाद :)
ग्रहण किया

बेशक यह स्टोरीबोर्ड में पहचानकर्ता को परिभाषित करने के साथ संयोजन में काम करता है (अगला जवाब देखें)
नेक

21

y ने मेरा मामला हल किया, जिसे मैंने टेबल व्यू सेल की "पहचानकर्ता" संपत्ति में नाम दिया।

यहां छवि विवरण दर्ज करें

मत भूलना: अपनी कक्षा में घोषणा करना: UITableViewDataSource

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

यह तस्वीर बेमेल है लेकिन इसने कुछ संकेत दिए हैं।
Martian2049

यह थोड़ा आउट-डेटेड है
Martian2049

13

बस एक सेल खींचें (जैसा कि आपने TableViewController के लिए किया था) और बस TableViewController पर सेल जारी करके इसमें जोड़ें। सेल पर क्लिक करें और इसकी विशेषताओं निरीक्षक के पास जाएं और इसके पहचानकर्ता को "सेल" के रूप में सेट करें। यह काम करता है।


मत भूलो कि आप इंस्पेक्टर इंस्पेक्टर पर आइडेंटिफ़ायर चाहते हैं ।

( "इंस्पेक्टर इंस्पेक्टर" पर "बहाली आईडी" नहीं !)


6
भ्रामक "बहाली आईडी" के लिए बाहर देखो - जो कुछ भी नहीं है! ऊपरी दाईं ओर स्थित फ़ुट टैब पर क्लिक करें, न कि थर्ड टैब पर !!!
फेटी

9

इस समस्या के होने का एक और कारण पहले की समस्या है। एक नया ViewController दिखाते समय, सीधे ViewController को लक्षित करने से निश्चित रूप से स्टोरीबोर्ड से प्रोटोटाइप कोशिकाओं को लोड नहीं किया जाएगा। सही समाधान हमेशा स्टोरी बोर्ड के माध्यम से इस तरह से दृश्य नियंत्रक को तुरंत करना चाहिए:

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

हाँ!! यह सच है!! यह मेरे साथ हुआ क्योंकि मैंने ViewController में संक्रमण किया जो कि अलग स्टोरीबोर्ड में बस के साथ स्थित है: self.pret (MyViewController, एनिमेटेड: गलत, पूर्ण: एनआईएल)। और ऐसा लगता है कि यह वास्तव में प्रोटोटाइप डाउनलोड नहीं करता है! मैंने सीधे MyViewController के साथ शुरू करने की कोशिश की है और यह सही काम करता है! यह तब भी काम करता है जब मैं अपने सेल के लिए NIB को लक्ष्य ViewDontroller के दृश्य में पंजीकृत कर रहा हूं।
वाइटा शापापोव

7

दोनों स्थानों पर पहचानकर्ता के नाम का मिलान करें

यह त्रुटि तब होती है जब स्विफ्ट फ़ाइल और स्टोरीबोर्ड में टेबलसेल का पहचानकर्ता नाम अलग होता है।

उदाहरण के लिए, पहचानकर्ता मेरे मामले में प्लेससेलडिफायर है।

1) स्विफ्ट फ़ाइल

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

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

    // Your code 

    return cell
}

2) स्टोरीबोर्ड

यहां छवि विवरण दर्ज करें


5

स्विफ्ट 3.0 में, इस तरह से अपने UITableViewCell के लिए एक क्लास रजिस्टर करें:

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

2

मुझे भी यही समस्या थी। इस मुद्दे ने मेरे लिए काम किया। स्टोरीबोर्ड में अपनी तालिका दृश्य चुनें और इसे स्थैतिक कोशिकाओं से गतिशील कोशिकाओं में बदलें।


2

यदि आपने अपने सेल को इंटरफ़ेस बिल्डर के माध्यम से परिभाषित किया है, तो अपने सेल को अंदर रखकर UICollectionView, या UITableView:

सुनिश्चित करें कि आपने एक वास्तविक वर्ग के साथ सेल को बांधा है, और बहुत महत्वपूर्ण है, जिसे आपने "टारगेट से इनहेरिट मॉड्यूल" चेक किया है


2

यह स्विफ्ट 3 और स्विफ्ट 4 पर काम करता था लेकिन अब यह काम नहीं कर रहा है।

पसंद

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

इसलिए मैंने स्विफ्ट 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 फ़ाइल में निर्णय लिया, समाधान के लिए पहचानकर्ता नहीं है, लेकिन ऐसा करने के लिए:

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

यहाँ newsDetails xib फ़ाइल नाम है।


0

स्विफ्ट 5

आपको देखने के लिए सेल को पंजीकृत करने के लिए यूआईएनबी विधि का उपयोग करने की आवश्यकता है

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 के साथ एक अन्य सबव्यू में चला गया।

सभी पहचानकर्ता, प्रतिनिधि तरीके, आईबी में लिंक आदि बरकरार रहते हैं, लेकिन अपवाद रनटाइम में उठाया जाता है।

एकमात्र समाधान सभी स्याही को साफ करना है, आईबी (आउटलेट, डेटासोर्स, डेलिगेट) में टेबलव्यू से संबंधित है और उन्हें फिर से बनाना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.