自定义UITableViewCell中的UILabel永远不会被初始化

tob*_*sen 5 uitableview ios swift

我在使用Xcode6(beta 4)在swift中创建自定义表视图单元时遇到了麻烦.更确切地说,我无法在单元格内访问(解包)我的自定义UILabel,因为它们永远不会被初始化.

以下是我所有设置的方法:

我在storyboard中创建了一个视图,其中包含一个带有原型单元格的表格视图:

它如何在故事板中看起来

视图连接到类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
    }
}
Run Code Online (Sandbox Code Playgroud)

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是我如何在实用程序窗格中配置单元格的图片(在故事板中):

公用事业窗格

tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> CourseTableViewCell当我想访问UILabels时,问题出现在函数内部.如果我要把类似的东西cell.titleLabel.text = "Course Title"我得到以下错误信息:

fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

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

Rik*_*les 0

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

    override func tableView(tableView:UITableView!, heightForRowAtIndexPath indexPath:NSIndexPath)->CGFloat {
    return 44
}
Run Code Online (Sandbox Code Playgroud)

(或者任何你想要的高度)就可以了。我复制了您的代码并验证了解决方案。

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

  • 抱歉,忘记添加您不能使用registerClass。这样做的目的是在代码中完全重新创建原型单元,从而将 IB 原型单元与代码断开。所以你的问题是双重的,其中之一是 Xcode bug。 (2认同)