Подтвердить что ты не робот

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

Я новичок в кодировании в целом и действительно новичок в 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)
      }
    }
  }

}
4b9b3361

Ответ 1

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

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

Ответ 2

Вы можете зарегистрировать класс для своего UITableViewCell следующим образом:

С Swift 3 +:

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

С Swift 2.2:

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

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

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

Ответ 3

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

Свифт 4+:

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

Свифт 3:

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

Swift 2.2:

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

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

enter image description here

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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


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

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

Ответ 7

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

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

Ответ 8

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

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

Ответ 9

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

Подробнее см. в этом посте:

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

Ответ 10

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

Ответ 11

Если вы определили свою ячейку через Интерфейсный UICollectionView, поместив ячейку в свой UICollectionView или UITableView:

Убедитесь, что вы связали ячейку с реальным классом, который вы создали, и очень важно, чтобы вы отметили "Inherit module from target"

Ответ 12

Только для новичков в iOS (таких как я), которые решили иметь несколько ячеек и в другом xib файле, решение состоит не в том, чтобы иметь идентификатор, а в следующем:

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

здесь newsDetails - это имя файла xib.

Ответ 13

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

Ответ 14

Раньше он работал на swift 3 и swift 4, но теперь не работает.

лайк

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

Таким образом, я попробовал большинство решений, упомянутых выше в swift 5, но мне не повезло.

Наконец я попробовал это решение, и оно сработало для меня.

override func viewDidLoad() 
{

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

Ответ 15

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

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()
}

Ответ 16

В поле "Подкласс" выберите UITableViewController.

Название класса изменяется на xxxxTableViewController. Оставь как есть.

Убедитесь, что выбран параметр "Также создать файл XIB".