невозможно удалить ячейку с идентификатором ячейки-необходимо зарегистрировать перо или класс для идентификатора или подключить ячейку прототипа в раскадровке


Я довольно новичок в кодировании в целом и действительно Новичок в Xcode (Swift). Я понимаю, что мне нужно зарегистрировать nib или класс, но я не понимаю, где и как?'.

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 61

11 ответов:

ты Ячейка Таблицы идентификатор к "ячейке" в вашей раскадровке?

или вы установили класс для UITableViewController для вашего класса в этой сцене?

вы можете зарегистрировать класс UITableViewCell такой:

С Swift 3+:

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

С Swift 2.2:

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

убедитесь, что тот же идентификатор"cell " также копируется в вашей раскадровке UITableViewCell.

"self" для получения класса используется имя класса, за которым следует .self.

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

y мой случай я решил это, назвав его в свойстве "идентификатор" ячейки табличного представления:

enter image description here

Не забудьте: объявить в своем классе: UITableViewDataSource

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

Это сработало для меня, может и тебе поможет :

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

мы должны установить идентификатор свойство к ячейке представления таблицы согласно изображению ниже,

enter image description here

просто перетащите ячейку (как вы сделали для TableViewController) и добавьте в нее, просто отпустив ячейку на TableViewController. Нажмите на ячейку и.Перейдите в Инспектор атрибутов и установите его идентификатор как "ячейка".Надеюсь, это сработает.


Не забывайте, что вы хотите идентификатор на Атрибуты Инспектора.

(не "идентификатор восстановления" на "Identity Inspector"!)

в Swift 3.0 зарегистрируйте класс для вашего UITableViewCell следующим образом:

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

Я только что встретил тот же вопрос и посмотреть этот пост. Для меня это потому, что я забыл установить идентификатор ячейки, также Как упоминалось в других ответах. Я хочу сказать, что если вы используете раскадровку для загрузки пользовательской ячейки, нам не нужно регистрировать ячейку представления таблицы в коде, что может вызвать другие проблемы.

смотрите этот пост для деталей:

пользовательская ячейка представления таблицы: метка IBOutlet равна нулю

еще одной причиной возникновения этой проблемы является более ранняя проблема. При отображении нового ViewController, создание экземпляра целевого ViewController напрямую, конечно, не будет загружать ячейки прототипа из раскадровки. Правильное решение всегда должно заключаться в том, чтобы создать экземпляр контроллера вида через раскадровку следующим образом:

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

У меня была та же проблема. Этот вопрос работал для меня. В раскадровке выберите вид таблицы и измените его из статических ячеек в динамические ячейки.

Если вы определили свою ячейку через Interface Builder, поместив ячейку внутри вашего UICollectionView или UITableView:

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