【问题标题】:UILabels in custom UITableViewCell never gets initialized自定义 UITableViewCell 中的 UILabel 永远不会被初始化
【发布时间】:2014-08-08 10:27:58
【问题描述】:

我在使用 Xcode6(beta 4)快速创建自定义表格视图单元格时遇到问题。更准确地说,我无法访问(解包)单元格内的自定义 UILabel,因为它们从未被初始化。

以下是我的全部设置方式:

我在情节提要中制作了一个视图,其中包含一个带有原型单元格的表格视图:

视图连接到 MyCoursesTableViewController 类,单元格(带有标识符 courseCell)连接到 CourseTableViewCell。我在下面粘贴了两个类(仅包含相关的代码):

MyCoursesTableViewController.swift

import UIKit

class MyCoursesTableViewController: NavToggleTableViewController {

    override func viewDidLoad() {
       super.viewDidLoad()

        self.tableView.registerClass(CourseTableViewCell.self, forCellReuseIdentifier: "courseCell")
    }

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

    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return 1
   }

    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

        var cell : CourseTableViewCell = tableView.dequeueReusableCellWithIdentifier("courseCell", forIndexPath: indexPath) as CourseTableViewCell

        // cell is not nil

        if let titleLabel = cell.titleLabel {
            // never gets here
        } else {
            cell.textLabel.text = "Course Title"
        }

        return cell
    }
}

NavToggleTableViewController 类只是我用于所有视图控制器的通用基类,不会影响结果。

CourseTableViewCell.swift

import UIKit

class CourseTableViewCell: UITableViewCell {

    @IBOutlet weak var courseIcon: UIImageView!
    @IBOutlet weak var teacherIcon: UIImageView!
    @IBOutlet weak var studentsCountIcon: UIImageView!
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var studentsCountLabel: UILabel!
    @IBOutlet weak var teacherLabel: UILabel!

    init(style: UITableViewCellStyle, reuseIdentifier: String!) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

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

下面是我如何在实用程序窗格中配置单元格的图片(在情节提要中):

当我想访问 UILabel 时,函数 tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> CourseTableViewCell 内部会出现问题。如果我输入cell.titleLabel.text = "Course Title" 之类的内容,我会收到以下错误消息:

fatal error: unexpectedly found nil while unwrapping an Optional value

我哪里做错了?非常感谢任何帮助,谢谢!

【问题讨论】:

    标签: ios uitableview swift


    【解决方案1】:

    正如 UITableView Using Swift 的最后一个答案中所解释的,这是一个 Xcode 错误。添加以下内容:

        override func tableView(tableView:UITableView!, heightForRowAtIndexPath indexPath:NSIndexPath)->CGFloat {
        return 44
    }
    

    (或任何你想要的高度),你会没事的。 我复制了您的代码并验证了解决方案。

    抱歉,我忘记了另一件事:你不能registerClass:forCellReuseIdentifier。当您在界面生成器中设置表格和原型单元格时,这已经完成。

    【讨论】:

    • 感谢您的建议,但我只是尝试了与以前相同的结果。你介意分享你的代码吗?
    • 对不起,忘记添加你不能使用 registerClass。这将做的是在代码中完全重新创建一个原型单元,将您的 IB 原型单元与您的代码断开连接。所以你的问题是双重的,其中之一是 Xcode 错误。
    【解决方案2】:

    很抱歉过了这么久才回复,但整个周末我都在为这个确切的问题而烦恼。 XCode 8.3.2 (8E2002) 上仍然存在此错误,这是我编写这些行时的最新错误。我遇到了与 OP 完全相同的问题并添加了

        override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 44
    }
    

    对我不起作用。唯一对我有用的是从我的viewDidLoad 中删除它:

        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.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    
    
        // REMOVE THIS v v v v v        
        self.tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "MyCustomCell")
        // REMOVE THIS ^ ^ ^ ^ ^ 
        // Do whatever you want here…
    }
    

    heightForRowAt indexPath 无效,你不需要用它来修复它。

    我希望这对某人也有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2011-08-11
      • 2010-12-26
      • 2012-04-18
      • 1970-01-01
      • 2019-06-21
      • 2012-08-03
      相关资源
      最近更新 更多