简体   繁体   English

表格视图不显示单元格

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM