斯威夫特 | TableView 为空/空白(使用自定义单元格)

Posted

技术标签:

【中文标题】斯威夫特 | TableView 为空/空白(使用自定义单元格)【英文标题】:Swift | TableView is Empty / Blank (using Custom Cell) 【发布时间】:2016-10-15 09:39:50 【问题描述】:

我的 TableView 是空的/只显示空白单元格(屏幕截图) 我用 TableViewController 和用 TableView 的 ViewController 都试过了——两者都显示了相同的结果。 enter image description here

所以我试图确定问题的确切位置,似乎没有读取“for-statesment”。 (见打印的支票)

我是编码新手,但这没有任何意义,我在 *** 上尝试了所有很棒的建议,但似乎没有一个有效 (所有插座都已连接等)

我将发布两种变体:ViewController 和 TableViewController(两者都应该获得相同的信息)

TableViewController:

import UIKit
import Parse

class HistoryTableViewController: UITableViewController 

var zeit = [String]()
var kosten = [String]()
var kilometer = [String]()
var datum = [String]()


override func viewDidLoad() 
    super.viewDidLoad()


    let query = PFQuery(className: "GemachteFahrten")

    query.whereKey("gefahreneZeit", equalTo: (PFUser.current()?.objectId!)!)

    query.whereKey("kosten", equalTo: (PFUser.current()?.objectId!)!)

    query.whereKey("createdAt", equalTo: (PFUser.current()?.objectId!)!)

    query.whereKey("gefahreneKilometer", equalTo: (PFUser.current()?.objectId!)!)

    print("check1")

    query.findObjectsInBackground  (objects, error) in

        if error != nil 

            print("error finding user data")


         else 

            print("check2")
            if let fahrtenRequests = objects 

                self.zeit.removeAll()
                self.datum.removeAll()
                self.kosten.removeAll()
                self.kilometer.removeAll()

                print("check3")


                for fahrtenRequest in fahrtenRequests 

                    print("check4")

                    self.zeit.append(fahrtenRequest["gefahreneZeit"] as! String!)
                    self.kosten.append(fahrtenRequest["kosten"] as! String)
                    self.datum.append(fahrtenRequest["createdAt"] as! String)
                    self.kilometer.append(fahrtenRequest["gefahreneKilometer"] as! String)

                    self.tableView.reloadData()

                    print("check5")

                
                print("check6")

            
         
    

    self.tableView.reloadData()


override func viewDidAppear(_ animated: Bool) 



override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int 
    // #warning Incomplete implementation, return the number of sections
    return 1


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows
    return datum.count



override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "CellHistory", for: indexPath) as! CellHistoryViewControllerTableViewCell


            cell.durationCell.text = zeit[indexPath.row]

            cell.costCell.text = kosten[indexPath.row]
            cell.routeCell.text = kilometer[indexPath.row]

            cell.dateCell.text = datum[indexPath.row]

            return cell


在控制台中它会打印: So it seems the for-statement is not read

看来这就是问题所在?还是我在其他地方做错了什么?:

print("check3")


                for fahrtenRequest in fahrtenRequests 

                    print("check4")

                    self.zeit.append(fahrtenRequest["gefahreneZeit"] as! String!)
                    self.kosten.append(fahrtenRequest["kosten"] as! String)
                    self.datum.append(fahrtenRequest["createdAt"] as! String)
                    self.kilometer.append(fahrtenRequest["gefahreneKilometer"] as! String)

                    self.tableView.reloadData()

                    print("check5")

                
                print("check6")

这也是 ViewController 的另一个变体并添加了 TableView:

import UIKit
import Parse

class HistoryViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

var zeit = [String]()
var kosten = [String]()
var kilometer = [String]()
var datum = [String]()

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() 
    super.viewDidLoad()

    let query = PFQuery(className: "GemachteFahrten")

    query.whereKey("gefahreneZeit", equalTo: (PFUser.current()?.objectId!)!)

    query.whereKey("kosten", equalTo: (PFUser.current()?.objectId!)!)

    query.whereKey("createdAt", equalTo: (PFUser.current()?.objectId!)!)

    query.whereKey("gefahreneKilometer", equalTo: (PFUser.current()?.objectId!)!)

    print("check1")

    query.findObjectsInBackground  (objects, error) in

        if error != nil 

            print("error finding user data")

         else 

            print("check2")
            if let fahrtenRequests = objects 

                self.zeit.removeAll()
                self.datum.removeAll()
                self.kosten.removeAll()
                self.kilometer.removeAll()

                print("check3")


                for fahrtenRequest in fahrtenRequests 

                    print("check4")

                    self.zeit.append(fahrtenRequest["gefahreneZeit"] as! String!)
                    self.kosten.append(fahrtenRequest["kosten"] as! String)
                    self.datum.append(fahrtenRequest["createdAt"] as! String)
                    self.kilometer.append(fahrtenRequest["gefahreneKilometer"] as! String)

                    self.tableView.reloadData()

                    print("check5")

                
                print("check6")

            


        

    

    self.tableView.reloadData()
   

override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()





internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows

         return datum.count



internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell: CellHistoryViewControllerTableViewCell = tableView.dequeueReusableCell(withIdentifier: "CellHistory", for: indexPath) as! CellHistoryViewControllerTableViewCell


    cell.durationCell.text = zeit[indexPath.row]

    cell.costCell.text = kosten[indexPath.row]
    cell.routeCell.text = kilometer[indexPath.row]

    cell.dateCell.text = datum[indexPath.row]

    return cell
   

还有自定义单元格代码:

import UIKit

class CellHistoryViewControllerTableViewCell: UITableViewCell 


@IBOutlet weak var dateCell: UILabel!

@IBOutlet weak var durationCell: UILabel!

@IBOutlet weak var costCell: UILabel!

@IBOutlet weak var routeCell: UILabel!

override func awakeFromNib() 
    super.awakeFromNib()
    // Initialization code



override func setSelected(_ selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
 

我真的希望有人认识到这个问题,如果您需要更多信息或屏幕截图,请告诉我 :)

再次感谢您的帮助和时间:)

【问题讨论】:

为什么要删除check2 和 if let 语句之后的所有对象? fahrtenrequest 之后是空的,所以没有内容可以循环 我认为只有在有新对象要加载时,他才会删除所有旧对象... 我会在 print("check3") 之后使用 print("fahrtenRequests.count = (fahrtenRequests.count)") 打印出 fahrtenRequests 中的项目数,以进一步调查此问题。或者按照 Zeb 的建议更好地使用调试器。 顺便说一句,尝试使用带断点的调试器来看看到底发生了什么 我用 -fahrtenrequests.count 进行了尝试,它等于 0(也在删除删除部分之后;)),打印对象时我得到一个空数组..soo 一定有问题从 Parse 中获取我的字符串...我尝试了多种组合,但没有任何效果 :( 并且所有信息都在 parse 中进行了三次检查!.. 也许你在代码中看到了一些令人担忧的东西?@slashburn 【参考方案1】:

您没有将 table view 委托设置为 self 这就是它发生的原因。 在ViewController中添加TableView:

    在 viewDidLoad 中设置 self.tableView.delegate = self. 将您的客户单元格注册到表格视图,如 viewDidLoad 中的示例 tableView.registerNib(UINib(nibName: "nameOfTheNib", bundle: nil), forCellReuseIdentifier: "reuseIdentifier")cellForRowAtIndexPath 中使用"reuseIdentifier" 创建该单元格 它会起作用的

【讨论】:

谢谢! :) 不幸的是它不起作用,从解析中获取字符串存在某种问题,因为数组中没有对象:/【参考方案2】:

您需要将此代码添加到您的cellForRowAtIndexPath

if cell == nil 
    cell = MyCell(style: UITableViewCellStyle.Default, reuseIdentifier: kCellIdentifier)

所以你的方法是-

internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell: CellHistoryViewControllerTableViewCell = tableView.dequeueReusableCell(withIdentifier: "CellHistory", for: indexPath) as! CellHistoryViewControllerTableViewCell

  if cell == nil 
    cell = CellHistoryViewControllerTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CellHistory")

    cell.durationCell.text = zeit[indexPath.row]

    cell.costCell.text = kosten[indexPath.row]
    cell.routeCell.text = kilometer[indexPath.row]

    cell.dateCell.text = datum[indexPath.row]

    return cell




也像这样注册你的xib:-

override func viewDidLoad() 
    super.viewDidLoad()

    tableView.registerNib(UINib(nibName: "CellHistoryViewControllerTableViewCell", bundle: nil), forCellReuseIdentifier: "CellHistory")

【讨论】:

感谢您的帮助! :).. 不幸的是它没有用,现在似乎从 parse ->empty array 获取信息存在某种问题:/

以上是关于斯威夫特 | TableView 为空/空白(使用自定义单元格)的主要内容,如果未能解决你的问题,请参考以下文章

Json Tableview 斯威夫特

tableView Cell 不显示数据,这是啥问题? (斯威夫特 3)

在终端上获取 URL 后如何将数据传递给 tableview?斯威夫特 5

传递参数时无法识别的选择器 - TableView 单元格中的 UIButton |斯威夫特 iOS

TableView 部分更改标题对齐方式

斯威夫特:我怎样才能从代码中删除出口?