не в змозі видалити комірок з ідентифікатором Cell - необхідно зареєструвати нитку або клас для ідентифікатора або з'єднати комірку прототипу в дошці розкадрування


114

Я досить новий в кодуванні взагалі і справді новий 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)
      }
    }
  }

}

11
Слідкуйте за заплутаним "ідентифікатором відновлення" - що нічого! Перейдіть на вкладку ЧЕТВЕРТА вгорі праворуч, а не на третю вкладку !!
Fattie

Відповіді:


82

Чи встановили ви ідентифікатор комірки таблиці на " Стільниця " у вашій дошці повідомлень?

Або ви встановили для цього класу клас для UITableViewControllerсвого класу?


102

Ви можете зареєструвати клас для UITableViewCellподібного:

За допомогою Swift 3+:

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

З Swift 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

Це працювало для мене. Можливо, вам теж допоможе:

Swift 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
Бог вас благословить! Врятувало пару мого життя
Раген Дасс

26

У мене сьогодні виникло це питання, яке було вирішено шляхом вибору Продукт -> Очистити. Я так розгубився, оскільки мій код був належним. Проблема почалася з використання команди-Z занадто багато разів :)


1
Серйозно витратив понад годину, намагаючись налагодити це. Дякую :)
пробудив

Звичайно, це працює в поєднанні з визначенням ідентифікатора на дошці повідомлень (див. Наступну відповідь)
Неч

21

y мій випадок я вирішив це, назвавши його у властивості "Ідентифікатор" в комірці View View:

введіть тут опис зображення

Не забудьте: оголосити у своєму класі: UITableViewDataSource

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

ця картина невідповідна, але вона дала деякий натяк.
Martian2049

це трохи застаріло просто
Martian2049

13

Просто перетягніть комірку (як це було зроблено для TableViewController) та додайте до неї просто, звільнивши комірку на TableViewController. Клацніть на клітинку і. Перейдіть до інспектора атрибутів та встановіть його ідентифікатор як "Стільниця". Сподівайтеся, він працює.


Не забувайте , що ви хочете , ідентифікатор на Attributes Inspector .

( НЕ "Ідентифікатор відновлення" у "Інспектора посвідчення особи"!)


6
Слідкуйте за заплутаним "ідентифікатором відновлення" - що нічого! Перейдіть на вкладку ЧЕТВЕРТА вгорі праворуч, а не на третю вкладку !!!
Fattie

9

Ще одна причина цього питання - це більш рання проблема. Коли буде показано новий ViewController, екземпляр цільового ViewController безпосередньо, звичайно, не завантажить прототипові комірки з StoryBoard. Правильним рішенням завжди має бути екземпляр контролера перегляду через дошку розповідей так:

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

Так!! Це правда!! Це трапилося зі мною, тому що я перейшов до ViewController, який знаходиться в різних дошках розкадрувань просто з: self.present (MyViewController, анімований: false, завершення: nil). І схоже, що прототип справді не завантажує! Я намагався почати безпосередньо з MyViewController, і це працює правильно! Він також працює, коли я реєструю NIB для своєї комірки у viewDidLoad цільового ViewController.
Вітя Шурапов

7

Зіставте ім’я ідентифікатора в обох місцях

Ця помилка виникає, коли ім'я ідентифікатора Tablecell відрізняється у файлі Swift та The Storyboard.

Наприклад, в моєму випадку ідентифікатор - placecellIdentifier .

1) Файл Swift

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

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

    // Your code 

    return cell
}

2) Розповідь

введіть тут опис зображення


5

У Swift 3.0 зареєструйте клас для свого UITableViewCell таким чином:

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

2

У мене була така ж проблема. Це питання працювало для мене. У дошці розкадрування виберіть подання таблиці та перетворіть його зі статичних комірок на динамічні комірки.


2

Якщо ви визначили свою клітинку за допомогою Інтерфейсу, будуючи комірку всередині UICollectionView, або UITableView:

Переконайтесь, що ви зв’язали комірку з фактичним створеним вами класом, і дуже важливо, щоб ви встановили прапорець "Спадковий модуль від цілі"


2

Раніше він працював на Swift 3 та Swift 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 дорівнює нулю


0

Просто для тих, хто є новим для iOS-приятелів (як я), які вирішили мати декілька комірок і в іншому файлі xib, рішення полягає не в тому, щоб мати ідентифікатор, а зробити це:

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

тут newsDetails - це ім'я файлу xib.


0

Швидкий 5

вам потрібно використовувати метод UINib для реєстрації комірки в 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

У полі "Підклас" виберіть UITableViewController.

Назва класу змінюється на xxxxTableViewController. Залиште так, як є.

Переконайтесь, що вибрано параметр «Також створити XIB файл».


0

Я зіткнувся з цим повідомленням, коли UITableView в ІБ було переміщено в інший підвід з Cmd-C - Cmd-V.

Всі ідентифікатори, делегатні методи, посилання в ІБ тощо залишаються недоторканими, але виняток виникає під час виконання.

Єдине рішення - очистити всі чорнила, пов'язані з переглядом таблиці в ІБ (випуск, джерело даних, делегат) і зробити їх знову.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.