Ответ 1
Установили ли вы идентификатор ячейки таблицы "Cell" в раскадровке?
Или вы задали класс для UITableViewController
для своего класса в этой сцене?
Я новичок в кодировании в целом и действительно новичок в 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)
}
}
}
}
Установили ли вы идентификатор ячейки таблицы "Cell" в раскадровке?
Или вы задали класс для 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
.
Это сработало для меня, может помочь вам тоже:
Свифт 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")
Мы должны установить для свойства " Идентификатор" ячейку табличного представления, как показано на изображении ниже,
У меня была эта проблема сегодня, которая была решена путем выбора Product → Clean. Я был так смущен, так как мой код был правильным. Проблема начиналась с использования команды -Z слишком много раз:)
y мой случай я решил это, назвав его в свойстве "Идентификатор" в ячейке просмотра таблицы:
Не забывайте: объявить в своем классе: UITableViewDataSource
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell
Просто перетащите ячейку (как и для TableViewController) и добавьте ее, просто отпустив ячейку на TableViewController. Нажмите на ячейку and.Go на свой инспектор атрибутов и установите его идентификатор как "Ячейка". Надеемся, что он работает.
Не забывайте, что вы хотите Идентификатор в Инспекторе атрибутов.
( НЕ "Идентификатор восстановления" в "Identity Inspector"!)
Еще одна причина возникновения этой проблемы - более ранняя проблема. При показе нового ViewController создание экземпляра целевого ViewController напрямую, конечно, не будет загружать ячейки прототипа из StoryBoard. Правильным решением всегда должно быть создание экземпляра контроллера представления через раскадровку:
storyboard?.instantiateViewController(withIdentifier: "some_identifier")
В Swift 3.0 зарегистрируйте класс для вашего UITableViewCell следующим образом:
tableView.register(UINib(nibName: "YourCellXibName", bundle: nil), forCellReuseIdentifier: "Cell")
Я только что встретил ту же проблему и посмотрел этот пост. Для меня это потому, что я забыл набор идентификаторов ячейки, также как упоминалось в других ответах. Я хочу сказать, что если вы используете раскадровку для загрузки пользовательской ячейки, нам не нужно регистрировать ячейку представления таблицы в коде, что может вызвать другие проблемы.
Подробнее см. в этом посте:
Пользовательская ячейка таблицы таблиц: ярлык IBOutlet равен нулю
У меня такая же проблема. Этот вопрос работал для меня. В раскадровке выберите вид таблицы и измените его из статических ячеек в динамические ячейки.
Если вы определили свою ячейку через Интерфейсный UICollectionView
, поместив ячейку в свой UICollectionView
или UITableView
:
Убедитесь, что вы связали ячейку с реальным классом, который вы создали, и очень важно, чтобы вы отметили "Inherit module from target"
Только для новичков в iOS (таких как я), которые решили иметь несколько ячеек и в другом xib файле, решение состоит не в том, чтобы иметь идентификатор, а в следующем:
let cell = Bundle.main.loadNibNamed("newsDetails", owner: self, options: nil)?.first as! newsDetailsTableViewCell
здесь newsDetails - это имя файла xib.
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")
}
Раньше он работал на 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")
}
Моя проблема заключалась в том, что я асинхронно регистрировал ячейку табличного представления в очереди отправки. Если вы зарегистрировали источник табличного представления и ссылку на делегат в раскадровке, то очередь отправки задержит регистрацию ячейки, поскольку имя предполагает, что это произойдет асинхронно, и ваше табличное представление ищет ячейки.
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()
}
В поле "Подкласс" выберите UITableViewController.
Название класса изменяется на xxxxTableViewController. Оставь как есть.
Убедитесь, что выбран параметр "Также создать файл XIB".