Table 视图不显示单元格
Table View not displaying cells
我是初学者,很抱歉,如果这是一个愚蠢的问题。我正在尝试创建一个 table 视图来从 Firebase 实时数据库 API 加载数据。我想我设置正确,它不会引发任何错误或崩溃。但是,它也没有调用 cellsForRowAt
方法。因此,它不显示任何单元格。它显示了线条,它们可以滚动并 spring 左右,但它们是默认宽度。它确实调用了 numberOfRowsInSection
方法,我已经通过控制台日志验证了这一点。这是整个视图控制器...
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
}
}
在此先感谢您的帮助!
更新:我删除了 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
更新:错误消息 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:
删除这个
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 0
}
你告诉 table 部分的数量将为 0 ,然后你希望它如何显示任何内容
尝试
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
}
}
首先,通过标签访问单元格视图不是一个好习惯,其他不需要在 'viewDidAppear' 方法中重新加载 tableView,您也应该在覆盖 [=26= 时调用 'super.viewDidAppear(animated)' ] 方法。
当你想从 tableView 中取出单元格时,单元格标识符应该与你在 Storyboard 中设置的相同。
TableView 应该 return 至少一个部分,或者您可以删除 numberOfSections 默认是一个。
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
}
}
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
}
}
希望这对您有所帮助。 :)
我是初学者,很抱歉,如果这是一个愚蠢的问题。我正在尝试创建一个 table 视图来从 Firebase 实时数据库 API 加载数据。我想我设置正确,它不会引发任何错误或崩溃。但是,它也没有调用 cellsForRowAt
方法。因此,它不显示任何单元格。它显示了线条,它们可以滚动并 spring 左右,但它们是默认宽度。它确实调用了 numberOfRowsInSection
方法,我已经通过控制台日志验证了这一点。这是整个视图控制器...
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
}
}
在此先感谢您的帮助!
更新:我删除了 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
更新:错误消息 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:
删除这个
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 0
}
你告诉 table 部分的数量将为 0 ,然后你希望它如何显示任何内容
尝试
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
}
}
首先,通过标签访问单元格视图不是一个好习惯,其他不需要在 'viewDidAppear' 方法中重新加载 tableView,您也应该在覆盖 [=26= 时调用 'super.viewDidAppear(animated)' ] 方法。
当你想从 tableView 中取出单元格时,单元格标识符应该与你在 Storyboard 中设置的相同。
TableView 应该 return 至少一个部分,或者您可以删除 numberOfSections 默认是一个。
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
}
}
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
}
}
希望这对您有所帮助。 :)