[英]Table View not displaying cells
I'm a beginner, so sorry if it's a dumb issue.我是初学者,如果这是一个愚蠢的问题,请见谅。 I'm trying to create a table view that loads data from the Firebase Realtime DB API.我正在尝试创建一个从 Firebase Realtime DB API 加载数据的表视图。 I think I set it up right, it doesn't throw any errors or crash.我想我设置正确,它不会抛出任何错误或崩溃。 However, it is also not calling the cellsForRowAt
method.但是,它也没有调用cellsForRowAt
方法。 Thus, it's not displaying any cells.因此,它不显示任何单元格。 It shows the line, and they can kind of be scrolled and they spring around, but they are the default width.它显示了线条,它们可以滚动并弹出,但它们是默认宽度。 It does call the numberOfRowsInSection
method though, I've verified this through console logs.它确实调用了numberOfRowsInSection
方法,我已经通过控制台日志验证了这一点。 Here is the entire view controller...这是整个视图控制器......
class UpcomingTableViewController: UITableViewController {
var upcomingPosts = [upcomingPost]()
override func viewDidLoad() {
super.viewDidLoad()
print("loaded")
let ref: DatabaseReference
ref = Database.database().reference()
let dbref = ref.child("auctionHandler").child("upcoming")
dbref.queryOrderedByKey().observe(DataEventType.childAdded, with: { (snapshot) in
let snapshot = snapshot.value as! NSDictionary
let shoe = snapshot["name"] as! String
let colorway = snapshot["colorway"] as! String
let date = snapshot["date"] as! String
let newPost = upcomingPost(shoe: shoe, colorway: colorway, date: date)
self.upcomingPosts.insert(newPost, at: 0)
//print(self.upcomingPosts)
self.tableView.reloadData()
})
}
override func viewDidAppear(_ animated: Bool) {
self.tableView.reloadData()
}
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 0
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
print(upcomingPosts.count)
return upcomingPosts.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("ran")
let cell = tableView.dequeueReusableCell(withIdentifier: "upcoming", for: indexPath)
let shoe = cell.viewWithTag(1) as! UILabel
shoe.text = upcomingPosts[indexPath.row].shoe
let colorway = cell.viewWithTag(2) as! UILabel
colorway.text = upcomingPosts[indexPath.row].colorway
print(cell)
print("------")
return cell
}
}
Thanks in advance for any help!在此先感谢您的帮助!
UPDATE: I've removed numberOfSections
, it throws this crash更新:我已经删除了numberOfSections
,它引发了这次崩溃
(
0 CoreFoundation 0x00007fff23c4f02e __exceptionPreprocess + 350
1 libobjc.A.dylib 0x00007fff50b97b20 objc_exception_throw + 48
2 CoreFoundation 0x00007fff23c4ebf9 -[NSException raise] + 9
3 Foundation 0x00007fff256f2ef3 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 325
4 UIKitCore 0x00007fff47d3410f -[UIView(CALayerDelegate) setValue:forKey:] + 171
5 UIKitCore 0x00007fff474b9a32 -[UIRuntimeOutletConnection connect] + 109
6 CoreFoundation 0x00007fff23c3b052 -[NSArray makeObjectsPerformSelector:] + 242
7 UIKitCore 0x00007fff474b6bda -[UINib instantiateWithOwner:options:] + 2190
8 UIKitCore 0x00007fff47a3a229 -[UITableView _dequeueReusableViewOfType:withIdentifier:] + 610
9 UIKitCore 0x00007fff47a3a865 -[UITableView _dequeueReusableCellWithIdentifier:forIndexPath:usingPresentationValues:] + 496
10 UIKitCore 0x00007fff47a3a641 -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:] + 91
11 Sole Club 0x000000010e306031 $s9Sole_Club27UpcomingTableViewControllerC05tableE0_12cellForRowAtSo07UITableE4CellCSo0lE0C_10Foundation9IndexPathVtF + 577
12 Sole Club 0x000000010e3068c5 $s9Sole_Club27UpcomingTableViewControllerC05tableE0_12cellForRowAtSo07UITableE4CellCSo0lE0C_10Foundation9IndexPathVtFTo + 165
13 UIKitCore 0x00007fff47a5468e -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 781
14 UIKitCore 0x00007fff47a1d667 -[UITableView _updateVisibleCellsNow:] + 3081
15 UIKitCore 0x00007fff47a3d78b -[UITableView layoutSubviews] + 194
16 UIKitCore 0x00007fff47d34d01 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2478
17 QuartzCore 0x00007fff2b138d41 -[CALayer layoutSublayers] + 255
18 QuartzCore 0x00007fff2b13ef33 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 517
19 QuartzCore 0x00007fff2b14a86a _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 80
20 QuartzCore 0x00007fff2b0917c8 _ZN2CA7Context18commit_transactionEPNS_11TransactionEd + 324
21 QuartzCore 0x00007fff2b0c6ad1 _ZN2CA11Transaction6commitEv + 643
22 QuartzCore 0x00007fff2b0c743a _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 76
23 CoreFoundation 0x00007fff23bb1617 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
24 CoreFoundation 0x00007fff23bac0ae __CFRunLoopDoObservers + 430
25 CoreFoundation 0x00007fff23bac72a __CFRunLoopRun + 1514
26 CoreFoundation 0x00007fff23babe16 CFRunLoopRunSpecific + 438
27 GraphicsServices 0x00007fff38438bb0 GSEventRunModal + 65
28 UIKitCore 0x00007fff4784fb48 UIApplicationMain + 1621
29 Sole Club 0x000000010e3236bb main + 75
30 libdyld.dylib 0x00007fff51a1dc25 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
UPDATE: Error message header更新:错误消息标题
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UITableViewCell 0x7fdc62e847f0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key colorway.'
*** First throw call stack:
Remove this删除这个
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 0
}
you tell the table that num of sections will be 0 , then how you expect it to display anything你告诉表节数将为 0 ,然后你希望它如何显示任何内容
Try尝试
var once = true // add this as an instance var
self.upcomingPosts.insert(newPost, at: 0)
if once {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0 ) {
self.tableView.reloadData()
self.once = false
}
}
First of call it's not a good practice to access cell views by tags, other is not needed to reload tableView in 'viewDidAppear' method also you should call 'super.viewDidAppear(animated)' when you override 'viewDidAppear' method.首先调用通过标签访问单元格视图不是一个好习惯,其他不需要在 'viewDidAppear' 方法中重新加载 tableView 你也应该在覆盖 'viewDidAppear' 方法时调用 'super.viewDidAppear(animated)'。
Cell identifier should be same like you set in Storyboard when you want to dequeue the cell from tableView.当您想从 tableView 中取出单元格时,单元格标识符应该与您在 Storyboard 中设置的相同。
TableView should return at least one section, or you can remove numberOfSections default is one. TableView 应该至少返回一个section,或者你可以去掉numberOfSections 默认为1。
class UpcomingTableViewController: UITableViewController {
//MARK: - Private properties
private var upcomingPosts = [upcomingPost]() //Name convention of swift for models is CamelCase so upcomingPost should be UpcomingPost
private var ref: DatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
initializeFirebaseDatabase()
fetchUpCommingPostsFromFirebase()
}
func initializeFirebaseDatabase() {
ref = Database.database().reference()
}
private func fetchUpCommingPostsFromFirebase() {
let dbref = ref.child("auctionHandler").child("upcoming")
dbref.queryOrderedByKey().observe(DataEventType.childAdded, with: { (snapshot) in
let snapshot = snapshot.value as! NSDictionary
let shoe = snapshot["name"] as! String
let colorway = snapshot["colorway"] as! String
let date = snapshot["date"] as! String
let newPost = upcomingPost(shoe: shoe, colorway: colorway, date: date)
self.upcomingPosts.insert(newPost, at: .zero)
self.tableView.reloadData()
})
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return upcomingPosts.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "upcoming", for: indexPath) as? UPComingPostsCell else { return UITableViewCell() }
cell.updateViews(withUpcomingPost: upcomingPosts[indexPath.row])
return cell
}
} }
Also tableView cell can be like this: tableView 单元格也可以是这样的:
class UPComingPostsCell: UITableViewCell {
@IBOutlet weak var shoeLabel: UILabel! //Connect labels from storyboards
@IBOutlet weak var colorWayLabel: UILabel!
func updateViews(withUpcomingPost post: UpcomingPost) {
shoeLabel.text = post.shoe
colorWayLabel.text = post.colorway
}
} }
Hope this helps.希望这可以帮助。 :) :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.