সনাক্তকারী সেল সহ কোনও ঘর সনাক্ত করতে অক্ষম - সনাক্তকারীটির জন্য অবশ্যই কোনও নিব বা একটি শ্রেণি নিবন্ধন করতে হবে বা স্টোরিবোর্ডে একটি প্রোটোটাইপ সেল সংযুক্ত করতে হবে


114

আমি সাধারণভাবে কোডিংয়ে মোটামুটি নতুন এবং এক্সকোডে (সুইফ্ট) সত্যিই নতুন। আমি বুঝতে পারি যে আমার একটি নিব বা ক্লাস নিবন্ধন করতে হবে তবে আমি 'কোথায় বা কিভাবে?' বুঝতে পারি না।

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
বিভ্রান্তিকর "পুনরুদ্ধার আইডি" দেখুন - যা কিছুই না! উপরের ডানদিকে চতুর্থ ট্যাবটি ক্লিক করুন , তৃতীয় ট্যাবটি নয়!
ফ্যাটি

উত্তর:


82

আপনি কি আপনার স্টোরিবোর্ডে সারণী সেল সনাক্তকারীটিকে "সেল" তে সেট করেছেন ?

নাকি UITableViewControllerআপনি সেই দৃশ্যে আপনার ক্লাসে ক্লাস স্থাপন করেছেন ?


102

আপনি নিজের UITableViewCellমতো করে ক্লাস রেজিস্ট্রেশন করতে পারেন :

সুইফট 3+ সহ:

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

সুইফট ২.২ সহ:

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

cellআপনার স্টোরিবোর্ডে একই শনাক্তকারী " " অনুলিপি করা হয়েছে তা নিশ্চিত করুন UITableViewCell

" self" ক্লাসের নামটি অনুসরণ করে ক্লাসের নাম ব্যবহারের জন্য .self


1
কোথায় রাখো?
আরজেবি

7
ইন viewDidLoad()
মেটে

18
আপনি যদি নিজের কাস্টম সেলটিতে একটি এক্সিব ব্যবহার করছেন, আপনাকে এটির জন্য এটি নিবন্ধিত করতে হবে:tableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
অতুলখাত্রি

উপরের সুইফট 3+
সলিউশনটি

38

এটি আমার পক্ষে কাজ করেছে, আপনাকেও সহায়তা করতে পারে:

সুইফট 4+:

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

সুইফট 3 :

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

সুইফট ২.২ :

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

আমাদের নীচের চিত্র অনুসারে সারণী ভিউ সেলে আইডেন্টিফায়ার সম্পত্তি সেট করতে হবে,

এখানে চিত্র বর্ণনা লিখুন


1
ঠিক এত সহজ :-)
লুচ-অলিভিয়ার

1
এটা কাজ করেছে! আমি আইডিটি আদর্শ ইন্সপেক্টরটিতে সেট করে দিচ্ছিলাম তবে এট্রিবিউট ইন্সপেক্টরটিতে এটি আটকানো আমার পক্ষে কাজ করেছে
ফ্যাটো

1
আল্লাহ্ তোমার মঙ্গল করুক! আমার জীবদ্দশায় বেশ কয়েকটি সংরক্ষণ করেছেন
র্যাগেন ড্যাজ

26

আমার আজ এই সমস্যাটি ছিল যা পণ্য -> ক্লিন নির্বাচন করে সমাধান করা হয়েছিল। আমার কোড যথাযথ হওয়ায় আমি খুব বিভ্রান্ত ছিলাম। সমস্যাটি অনেক সময় কমান্ড-জেড ব্যবহার করে শুরু হয়েছিল :)


1
এটি ডিবাগ করার চেষ্টা করে এক ঘন্টা ধরে গুরুতরভাবে কাটিয়েছি। আপনাকে ধন্যবাদ :)
জেগেছিল

অবশ্যই এটি স্টোরিবোর্ডে শনাক্তকারীকে সংজ্ঞায়নের সাথে মিলিত হয়ে কাজ করে (পরবর্তী উত্তর দেখুন)
নেচ

21

y আমার কেসটি আমি সারণী দর্শন ঘরের "আইডেন্টিফায়ার" বৈশিষ্ট্যে নাম দিয়ে সমাধান করেছি:

এখানে চিত্র বর্ণনা লিখুন

ভুলে যাবেন না: আপনার ক্লাসে ঘোষণা করতে: ইউআইটিএবল ভিউডাটা সোর্স

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

এই ছবিটি মেলেনি তবে এটি কিছু ইঙ্গিত দিয়েছে।
মার্টিয়ান2049

এটি সামান্য
সময়সীমার

13

কেবল একটি ঘর টেনে আনুন (যেমন আপনি টেবিলভিউ নিয়ন্ত্রণকারী হিসাবে করেছিলেন) এবং কেবলমাত্র টেলভিউকন্ট্রোলারের উপর সেলটি প্রকাশ করে এতে যুক্ত করুন। সেলে ক্লিক করুন এবং তার বৈশিষ্ট্য পরিদর্শকের কাছে যান এবং তার সনাক্তকারীটিকে "সেল" হিসাবে সেট করুন opeএই কাজ করে।


ভুলবেন না যদি আপনি চান আইডেন্টিফাইয়ার উপর পরিদর্শক আরোপ করা

( "পরিচয় পরিদর্শক" তে "পুনরুদ্ধার আইডি" নয় !)


6
বিভ্রান্তিকর "পুনরুদ্ধার আইডি" দেখুন - যা কিছুই না! উপরে ডানদিকে চতুর্থ ট্যাব ক্লিক করুন, তৃতীয় ট্যাব নয় !!!
ফ্যাটি

9

এই সমস্যাটি হওয়ার আরও একটি কারণ পূর্ববর্তী সমস্যা। একটি নতুন ভিউকন্ট্রোলার দেখানোর সময়, লক্ষ্য ভিউকন্ট্রোলারটিকে সরাসরি ইনস্ট্যান্ট করা অবশ্যই স্টোরিবোর্ড থেকে প্রোটোটাইপ সেলগুলি লোড করবে না। সঠিক সমাধানটি সর্বদা স্টোরি বোর্ডের মাধ্যমে ভিউ কন্ট্রোলারকে ইনস্ট্যান্ট করা উচিত:

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

হ্যাঁ!! এটা সত্যি!! আমার সাথে এটি ঘটেছিল কারণ আমি ভিউ কন্ট্রোলারকে স্থানান্তরিত করেছি যা কেবলমাত্র স্টোরিবোর্ডে অবস্থিত: সেল্ফ.প্রিসেন্ট (মাইভিউকন্ট্রোলার, অ্যানিমেটেড: মিথ্যা, সমাপ্তি: শূন্য)) এবং দেখে মনে হচ্ছে এটি সত্যিই প্রোটোটাইপটি ডাউনলোড করে না! আমি সরাসরি মাইভিউকন্ট্রোলার দিয়ে শুরু করার চেষ্টা করেছি এবং এটি ঠিক কাজ করে! লক্ষ্য ভিউকন্ট্রোলারের দর্শনডিডলডে আমি আমার সেলটির জন্য এনআইবি নিবন্ধন করি যখন এটিও কাজ করে।
ভিটিয়া শুরাপভ

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

সুইফট ৩.০ এ, আপনার ইউআইটিএবল ভিউসেল এর জন্য একটি শ্রেণি নিবন্ধ করুন:

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

আমি ঠিক একই সমস্যাটির সাথে দেখা করেছি এবং এই পোস্টটি দেখছি। আমার পক্ষে এটি কারণ কারণ আমি অন্য জবাবগুলিতে উল্লিখিত কক্ষের সনাক্তকারীটিকে ভুলে গিয়েছিলাম। আমি যা বলতে চাই তা হ'ল আপনি যদি কাস্টম সেল লোড করতে স্টোরিবোর্ডটি ব্যবহার করেন তবে আমাদের কোডে টেবিল ভিউ সেলটি নিবন্ধিত করার দরকার নেই, যা অন্যান্য সমস্যা তৈরি করতে পারে।

বিস্তারিত জানার জন্য এই পোস্টটি দেখুন:

কাস্টম টেবিল ভিউ সেল: আইবিআউটলেট লেবেল শূন্য


0

কেবলমাত্র নতুন আইওএস বন্ধুদের জন্য (আমার মতো) যারা একাধিক ঘর এবং একটি পৃথক xib ফাইলে থাকার সিদ্ধান্ত নিয়েছেন, সমাধানটি সনাক্তকারী না হয়ে এটি করার জন্য রয়েছে:

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

এখানে নিউজ ডেটেলগুলি হল 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

"সাবক্লাস অফ" ক্ষেত্রে, ইউআইটিএবল ভিউ কন্ট্রোলার নির্বাচন করুন।

ক্লাস শিরোনামটি xxxxxTableViewController এ পরিবর্তিত হয়। যেমন আছে ত্যাগ করুন।

নিশ্চিত করুন যে "এছাড়াও এক্সআইবি ফাইল তৈরি করুন" বিকল্পটি নির্বাচিত হয়েছে।


0

আমি এই বার্তায় দৌড়েছি যখন আইবিতে ইউআইটিএবলভিউ সিএমডি-সি - সিএমডি-ভি এর সাথে অন্য সাবউভিউতে স্থানান্তরিত হয়েছিল।

সমস্ত সনাক্তকারী, প্রতিনিধি পদ্ধতি, আইবিতে লিঙ্ক ইত্যাদি অক্ষত থাকে, তবে ব্যতিক্রমটি রানটাইমের সময় উত্থাপিত হয়।

একমাত্র সমাধান হ'ল আইবি (আউটলেট, ডাটাসোর্স, প্রতিনিধি) এর টেবিলভিউ সম্পর্কিত সমস্ত কালিগুলি সাফ করা এবং এগুলি আবার তৈরি করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.