swift - 下铸 Nib uitableviewcell

标签 swift uitableview ios8

对于我的应用,我希望有一个通用的单元格格式,根据内容为每个单元格提供相同的 UI 但不同的功能。 我认为任何简单的方法都是使用 @IBOutlets 创建一个名为 ToggleCell 的 uitableviewcell 子类:

class ToggleCell: UITableViewCell {
    // @IBOutlets here
}

并创建一个nib 文件,并将其作为其类。然后,我创建了一个具有自定义功能的子类,称为 TaskCell:

class TaskCell: ToggleCell {
    func load() {
        // do stuff
    }
}

但是,在 cellForRowAtIndexPath 中,当我使单元格出队时,向下转换失败:

let cell = cellForRowAtIndexPath(...) as! TaskCell

我做错了什么?有什么办法可以做得更好吗?

最佳答案

您需要使用 registerClass 方法在表格 View 上注册单元格类。但是,您的方法存在一个更根本的问题。您的单个 NIB 已经定义了特定的单元类(父类(super class) ToggleCell),它不能向下转换为任意子类。您应该做的是为单元格的自定义内容 View 创建一个 NIB 和类,并将其加载到父类(super class) ToggleCell 中。

class ToggleCellContentView: UIView {

    // Connect outlets in ToggleCellContentView.xib

    @IBOutlet weak var label: UILabel!

}

class ToggleCell: UITableViewCell {

    let view: ToggleCellContentView

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        // Load custom content view from NIB
        view = NSBundle.mainBundle().loadNibNamed("ToggleCellContentView",
            owner: nil, options: nil)[0] as! ToggleCellContentView

        super.init(style: .Default, reuseIdentifier: reuseIdentifier)

        // Add custom content view as subview
        contentView.addSubview(view)

        // Make custom content view span the cell
        view.setTranslatesAutoresizingMaskIntoConstraints(false)
        let viewDict = ["view": view]
        contentView.addConstraints(
            NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: nil, metrics: nil, views: viewDict))
        contentView.addConstraints(
            NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: nil, metrics: nil, views: viewDict))
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

class TaskCell: ToggleCell {

    func load() {
        // do stuff
    }

}

class OtherTaskCell: ToggleCell {

    func load() {
        // other do stuff
    }

}

然后只需在表格 View 上注册您的单元格类

tableView.registerClass(TaskCell.self, forCellReuseIdentifier: "taskCell")
tableView.registerClass(OtherTaskCell.self, forCellReuseIdentifier: "otherTaskCell")

并在数据源方法中对它们进行双端队列

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let taskcell = tableView.dequeueReusableCellWithIdentifier("taskcell", forIndexPath: indexPath) as! TaskCell
    taskcell.view.label.text = "Row \(indexPath.row)"
    return taskcell
}

关于swift - 下铸 Nib uitableviewcell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32535883/

相关文章:

ios - UITableView rowHeight UITableViewAutomaticDimension 单元格首次加载后高度错误

iphone - NSFetchedResultsController 添加实体在 tableView 中插入空白行

swift - “NSInvocationOperation”在 Xcode 6.1 中不可用

ios - 删除第三方键盘 "Add New Keyboard..."屏幕上的字幕

swift - 如何提取 PHAsset 的 Location 属性?

ios - 如何快速在特定表格 View 行执行特定操作?

ios - 是否可以在 UINavigationContoller 堆栈上推送 2 个单独的 UIViewController 实例

linux - 在 fedora 18 中安装 Swift

ios - 无法使用类型为 '[(String)]?' 的索引下标类型为 'Int' 的值

ios - 如何在 iOS 自定义键盘中切换单词选择 View (更改高度)?