自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?

Posted

技术标签:

【中文标题】自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?【英文标题】:Custom UITableView cell Nib file only shows up after select cell? 【发布时间】:2016-01-07 18:38:19 【问题描述】:

当我加载我的应用程序this is what happens. 时,由于某种原因,表格视图加载为空白。只有当我选择单元格并单击另一个单元格时,才会显示先前选择的单元格。但是对于第一个单元格,无论我在哪里/如何单击,我仍然看不到第一个单元格。

我不明白为什么会发生这种情况,因为我关注了this tutorial. 显然我做错了,如果有人能告诉我为什么会发生这种情况以及如何解决它,我将不胜感激。

在主情节提要中,我使用tableViewController SummaryTableViewController 和自定义UITableViewCell DayOfWeekTableViewCell。我有一个名为DayofWeekSpendingTableViewCell.xib 的表格视图单元格的笔尖文件。 Here's a list of all my files and their fileneames.

这是我的SummaryTableViewController 代码:

class SummaryTableViewController: UITableViewController 
    var dayOfWeek: [String] = [String]()
    var totalSpentPerDay: [Double] = [Double]()

    override func viewDidLoad() 
        super.viewDidLoad()

        dayOfWeek = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
        totalSpentPerDay = [0, 7.27, 0, 0, 39, 0, 0]
    

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return self.dayOfWeek.count
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        var cell = tableView.dequeueReusableCellWithIdentifier("summaryCell", forIndexPath: indexPath) as! DayOfWeekTableViewCell

        // Configure the cell...
        let nib = NSBundle.mainBundle().loadNibNamed("DayofWeekSpendingTableViewCell", owner: self, options: nil)
        cell = nib[0] as! DayOfWeekTableViewCell

        cell.dayOfWeek.text = dayOfWeek[indexPath.row]
        cell.totalAmountSpent.text = String(totalSpentPerDay[indexPath.row])

        return cell
    

这是我的自定义单元格DayOfWeekTableViewCell 代码:

class DayOfWeekTableViewCell: UITableViewCell 

    @IBOutlet weak var dayOfWeek: UILabel!
    @IBOutlet weak var totalAmountSpent: UILabel!

    override func awakeFromNib() 
        super.awakeFromNib()
    

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


在主情节提要中,我...

connected the custom cell DayOfWeekTableViewCell to the storyboard cell identified the storyboard cell as summaryCell

在笔尖文件DayofWeekSpendingTableViewCell.xib我已经...

connected my nib files to custom cell DayOfWeekTableViewCell identified my nib file as nibCell connected the outlets in my nib file to custom cell DayOfWeekTableViewCell

【问题讨论】:

能贴出didSelectRowAtIndexPath: 的代码吗? 为什么你没有在你的代码中检查 cell == nil ?为什么定义两个单元格(xib 中的 1 个和故事板中的 1 个)?为什么你没有注册 xib 以便在 tableview 中使用它? 把你的代码放到viewDidLoad中 【参考方案1】:

不是在 cellForRowAtIndexPath 中加载 NIB,而是在 viewDidLoad() 中加载 NIB 并注册它以用于您的表视图

override func viewDidLoad() 
    super.viewDidLoad()

    dayOfWeek = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
    totalSpentPerDay = [0, 7.27, 0, 0, 39, 0, 0]
    // Create a nib for reusing
    let nib = UINib(nibName: "DayofWeekSpendingTableViewCell", bundle: nil)
    tableView.registerNib(nib, forCellReuseIdentifier: "summaryCell")

然后你可以直接访问 cellForRowAtIndexPath 中的单元格:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    // Configure the cell...
    let cell = tableView.dequeueReusableCellWithIdentifier("summaryCell", forIndexPath: indexPath) as! DayOfWeekTableViewCell
    cell.dayOfWeek.text = dayOfWeek[indexPath.row]
    cell.totalAmountSpent.text = String(totalSpentPerDay[indexPath.row])

    return cell

【讨论】:

您可能想要删除第一个var cell = ...,在一次调用cellForRowAtIndexPath 中两次出队会导致奇怪的行为,更不用说由于重新定义了单元格而无法编译: p 确实,你是对的,我会删除这个错字!谢谢 我遇到了问题,但正如 Alex Popov 指出的那样,我在出列单元格时需要小心。我有冲突的出队。

以上是关于自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?的主要内容,如果未能解决你的问题,请参考以下文章

从 Nib 加载时,自定义单元格永远不会排队?

uitableview 自定义单元格在向下滚动 uitableview 时丢失其内容

可扩展 UiTableView 的自定义单元格

为啥不调用基于 nib 的自定义表格单元格的 init 方法

使用 NIB 无法识别 UITableViewCell 内单击的单元格 UITableView

在 UICollectionView 中通过 NIB 添加自定义单元格