невозможно удалить ячейку с идентификатором ячейки-необходимо зарегистрировать перо или класс для идентификатора или подключить ячейку прототипа в раскадровке
Я довольно новичок в кодировании в целом и действительно Новичок в 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 ответов:
ты Ячейка Таблицы идентификатор к "ячейке" в вашей раскадровке?
или вы установили класс для
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 слишком много раз :)
Это сработало для меня, может и тебе поможет :
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")
мы должны установить идентификатор свойство к ячейке представления таблицы согласно изображению ниже,
просто перетащите ячейку (как вы сделали для 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")