表格视图显示空单元格

Posted

技术标签:

【中文标题】表格视图显示空单元格【英文标题】:Table view is showing empty cells 【发布时间】:2015-09-23 01:07:17 【问题描述】:

我有 2 个部分,第一个有 1 行,第二个有 4 行。我可以在故事板中看到开关、标签和文本字段。它在模拟器中加载空白。我检查了所有的 IBOutlets 都已连接。

以下是我在 Table View Controller 中的代码

import UIKit

class InfoTableViewController: UITableViewController 

var sectionArray: NSMutableArray = ["Social Security Benefits", "Demographics"]
var socialArray: NSMutableArray = ["Estimate Social Security Benefits"]
var demoArray: NSMutableArray = ["Name:", "DOB:", "Age of Retirement:", "Years of Retirement"]
override func viewDidLoad() 
    super.viewDidLoad()


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


// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.
    return self.sectionArray.count


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    if section == 0
        return socialArray.count
     else 
        return demoArray.count
    



override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    if indexPath.section == 0 
        if indexPath.row == 0 
            println(indexPath.section)
            println(indexPath.row)
            let cell: SocialTableCell = SocialTableCell(style: UITableViewCellStyle.Default, reuseIdentifier: "social")
            cell.social?.text = "Estimate"
            cell.toggle?.setOn(false, animated: true)

            return cell
        
     else if indexPath.section == 1 
        if indexPath.row == 0 
            println(indexPath.section)
            println(indexPath.row)
            let cell: NameTableCell = NameTableCell(style: UITableViewCellStyle.Default, reuseIdentifier: "name")
            return cell
        else if indexPath.row == 1
            println(indexPath.section)
            println(indexPath.row)
            let cell: DOBTableCell = DOBTableCell(style: UITableViewCellStyle.Default, reuseIdentifier: "DOB")
        else if indexPath.row == 2
            println(indexPath.section)
            println(indexPath.row)
            let cell: RetirementTableCell = RetirementTableCell(style: UITableViewCellStyle.Default, reuseIdentifier: "AgeOfRetirement")
        else if indexPath.row == 3
            println(indexPath.section)
            println(indexPath.row)
            let cell: YearsRetirementTableCell = YearsRetirementTableCell(style: UITableViewCellStyle.Default, reuseIdentifier: "YearsOfRetirement")
        

    


    return UITableViewCell()


    //cell.configureFlatCellWithColor(UIColor.greenSeaColor(), selectedColor: UIColor.cloudsColor(), roundingCorners: UIRectCorner())




我还为每个单元格创建了 5 个表格视图单元格类。我还检查了所有标识符,它们是正确的。

下面是我的故事板图片

但是当我运行它时,模拟器只显示部分并且单元格是空的。

任何帮助将不胜感激。 谢谢

【问题讨论】:

你设置了委托和数据源吗? 我用的是tableviewcontroller而不是tableview的view controller,它是自动设置的! 您需要阅读“表格视图编程指南”并了解如何正确实现您的cellForRowAtIndexPath 方法。您没有正确地将单元格出列,并且没有尝试将数据放入单元格中。这就是为什么它们是空白的。 我知道我没有设置较低的单元格,但我设置了社交单元格并且它不起作用。当第一个不工作时,我不想浪费时间设置那些。 确保cell.socialcell.toggle 不是nil 【参考方案1】:

您可以使用静态单元格来做到这一点。

    转到您的表格视图 => 属性检查器 => 在内容中选择静态单元格,然后在部分中放入 2(因为您有 2 个部分)

    然后单击 Storyboad Hierarchy 中的一个部分 => 属性检查器 => 在每个部分中放置您想要的行数(放置 1,因为您在第一部分中有一行)。再次选择另一个部分并放置您想要的行数想要(放 4,因为你在第二部分有 4 行)

    然后单击每一行单元格并添加标签并输入您的标签名称。您也可以为游览第一部分放置切换按钮。

    创建一个新的 cocoa touch 类:- 类看起来像这样(你应该评论或删除这些函数,

        // MARK: - Table view data source
    
     /*
         override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
          // #warning Potentially incomplete method implementation.
         // Return the number of sections.
            return 1
                  
    
          override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
          // #warning Incomplete method implementation.
         // Return the number of rows in the section.
            return 2
          
       */
    
      /*
          override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
           let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as! UITableViewCell
    
           // Configure the cell...
    
             return cell
          
     */
    

最后 Table 类看起来像这样,

     import UIKit

       class TableViewController: UITableViewController 

         override func viewDidLoad() 
          super.viewDidLoad()

           // Uncomment the following line to preserve selection between presentations
          // self.clearsSelectionOnViewWillAppear = false

          // Uncomment the following line to display an Edit button in the navigation bar for this view controller.

             

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

           override func viewWillAppear(animated: Bool) 
           super.viewWillAppear(animated)

           
       

【讨论】:

如果我这样做,我将无法更改单元格的外观,如圆边或不同颜色的部分。我还没有看过它,但是我将如何看待使用输入中的数字来计算不同选项卡的答案。 您可以添加图像或标签以使用不同的颜色部分,试试这个!!【参考方案2】:

这就是您的cellForRowAtIndexPath: 的样子。以下是您的第一部分第一行的示例,您可以相应地对齐所有其他部分。

作为旁注,请注意,除了您的第一部分第一行之外,对于所有其他表格行,您都没有设置任何标签等,并且该控件最终到达语句 return UITableViewCell() 导致空单元格。请仔细检查。

if indexPath.row == 0 
    println(indexPath.section)
    println(indexPath.row)

    let socialCellId: NSString = "social"
    var cell: SocialTableCell = tableView.dequeueReusableCellWithIdentifier(socialCellId) as SocialTableCell

    if cell == nil
    
        cell = SocialTableCell(style: UITableViewCellStyle.Default, reuseIdentifier:socialCellId)
    

    cell.social?.text = "Estimate"
    cell.toggle?.setOn(false, animated: true)

    return cell

【讨论】:

我尝试了解决方案,两件事。单元格不能与 nil 进行比较,因为单元格的类型是 secTableViewCell 而不是 secTableViewCell? (可选)。因为它不是可选的,所以它不能为零。第二,我不能调用社交和切换,因为它们是 SocialTableCell(我创建)的一部分,并且根据你的解决方案单元格是 UITableViewCell。 对于您的第一点,这里我们尝试从现有单元池中获取SocialTableCell,例如在您的初始渲染中可能返回nil。您可以设置一个断点并检查。对于第二个,这是我这边的错字,现在更正了:)。 @Dereck 我再次尝试了第一个点并做了断点并检查但 Xcode 不断给我错误“二进制运算符'=='不能应用于'uitableviewcell'和'nil'类型的操作数"【参考方案3】:

我遇到了完全相同的问题,上面的 cmets 都没有帮助我。我终于弄明白了,也许你也有同样的问题。

对我来说,我不小心在设计器中复制并粘贴了第二个表格视图。第二个表视图位于第一个表视图之上,但只有第一个表视图连接到我的 TableViewController,因此从未创建运行时可见的单元格,因此为空白。

检查一下,希望对您有所帮助。

Double TableView

【讨论】:

以上是关于表格视图显示空单元格的主要内容,如果未能解决你的问题,请参考以下文章

出现在空单元格中的表格视图分隔符

表格视图不显示单元格中的内容

如何隐藏不在最后的空单元格表格视图?斯威夫特 3

将 json 数据存储在表格视图的交替单元格中

如何使用自定义单元格根据按钮值加载表格视图?

表格视图单元格未正确更新