Saya cukup baru dalam pengkodean secara umum dan benar-benar baru mengenal Xcode (Swift). Saya memahami bahwa saya perlu mendaftarkan ujung pena atau kelas tetapi saya tidak mengerti 'di mana atau bagaimana?'.
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)
}
}
}
}
Jawaban:
Sudahkah Anda menyetel pengenal Sel Tabel ke "Sel" di papan cerita Anda?
Atau sudahkah Anda menetapkan kelas untuk
UITableViewController
kelas Anda dalam adegan itu?sumber
Anda dapat mendaftarkan kelas untuk Anda
UITableViewCell
seperti ini:Dengan Swift 3+:
Dengan Swift 2.2:
Pastikan pengenal yang sama "
cell
" juga disalin di papan cerita AndaUITableViewCell
."
self
" adalah untuk mendapatkan kelas, gunakan nama kelas yang diikuti dengan.self
.sumber
viewDidLoad()
tableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
Ini berhasil untuk saya, Semoga membantu Anda juga:
Swift 4+:
Cepat 3 :
Swift 2.2 :
sumber
Saya mengalami masalah ini hari ini yang diselesaikan dengan memilih Produk -> Bersihkan. Saya sangat bingung karena kode saya benar. Masalahnya dimulai dari terlalu sering menggunakan command-Z :)
sumber
y kasus saya, saya menyelesaikan ini dengan menamainya di properti "Identifier" dari Sel Tampilan Tabel:
Jangan lupa: untuk mendeklarasikan di Kelas Anda: UITableViewDataSource
sumber
Cukup seret sel (seperti yang Anda lakukan untuk TableViewController) dan tambahkan ke dalamnya hanya dengan melepaskan sel di TableViewController. Klik pada sel dan. Pergi ke inspektur atributnya dan setel pengenalnya sebagai "Sel". Semoga berhasil.
Jangan lupa Anda menginginkan Identifier pada Attributes Inspector .
( BUKAN "ID Pemulihan" pada "Inspektur Identitas"!)
sumber
Satu lagi alasan mengapa masalah ini terjadi adalah masalah sebelumnya. Saat menampilkan ViewController baru, membuat instance ViewController target secara langsung tentu saja tidak akan memuat sel prototipe dari StoryBoard. Solusi yang benar harus selalu memberi contoh pengontrol tampilan melalui papan cerita seperti ini:
sumber
Cocokkan nama pengenal di kedua tempat
Kesalahan ini terjadi ketika nama pengenal Tablecell berbeda di file Swift dan Storyboard.
1) File Swift
2) Papan Cerita
sumber
Di Swift 3.0, daftarkan kelas untuk UITableViewCell Anda seperti ini:
sumber
Saya memiliki masalah yang sama. Masalah ini berhasil untuk saya. Di storyboard, pilih tampilan tabel Anda dan ubah dari sel statis menjadi sel dinamis.
sumber
Jika Anda menentukan sel Anda melalui Pembuat Antarmuka, dengan menempatkan sel di dalam
UICollectionView
, atauUITableView
:Pastikan Anda mengikat sel dengan kelas sebenarnya yang Anda buat, dan yang sangat penting, Anda mencentang "Wariskan modul dari target"
sumber
Dulu bekerja pada swift 3 dan swift 4 tetapi sekarang tidak berfungsi.
Suka
Jadi saya telah mencoba sebagian besar solusi yang disebutkan di atas dalam 5 cepat tetapi tidak berhasil.
Akhirnya saya mencoba solusi ini dan berhasil untuk saya.
sumber
Masalah saya adalah saya mendaftarkan sel tampilan tabel di dalam antrian pengiriman secara asynchronous. Jika Anda telah mendaftarkan sumber tampilan tabel dan mendelegasikan referensi di storyboard, maka antrian pengiriman akan menunda pendaftaran sel karena namanya akan terjadi secara asinkron dan tampilan tabel Anda mencari sel.
Anda sebaiknya tidak menggunakan antrean pengiriman untuk pendaftaran ATAU lakukan ini:
sumber
Saya baru saja bertemu masalah yang sama dan melihat posting ini. Bagi saya itu karena saya lupa set pengenal sel, juga seperti yang disebutkan dalam jawaban lain. Yang ingin saya katakan adalah jika Anda menggunakan storyboard untuk memuat sel khusus, kita tidak perlu mendaftarkan sel tampilan tabel dalam kode, yang dapat menyebabkan masalah lain.
Lihat posting ini untuk detailnya:
Sel tampilan tabel kustom: Label IBOutlet nol
sumber
Hanya untuk teman-teman baru iOS (seperti saya) yang memutuskan untuk memiliki banyak sel dan dalam file xib yang berbeda, solusinya bukanlah memiliki pengenal tetapi melakukan ini:
di sini newsDetails adalah nama file xib.
sumber
Cepat 5
Anda perlu menggunakan metode UINib untuk mendaftarkan sel di viewDidLoad
sumber
Di bidang “Subkelas”, pilih UITableViewController.
Judul kelas berubah menjadi xxxxTableViewController. Biarkan apa adanya.
Pastikan opsi "Buat juga file XIB" dipilih.
sumber
Saya menemukan pesan ini ketika UITableView di IB dipindahkan ke subview lain dengan Cmd-C - Cmd-V.
Semua pengenal, metode delegasi, tautan di IB, dll. Tetap utuh, tetapi pengecualian dimunculkan pada saat runtime.
Satu-satunya solusi adalah menghapus semua tinta, terkait dengan tampilan tabel di IB (outlet, sumber data, delegasi) dan membuatnya lagi.
sumber