在运行时无法获取动态单元格类型

时间:2019-08-06 12:01:56

标签: swift types

我有这个在Swift项目中使用自定义单元格的示例:

let cell = tableView.dequeueReusableCell(withIdentifier: "LabelCell", for: indexPath)
                    as! HeadlineTableViewCell

但是在我的项目中,实际上我有一个名为 mycells 的自定义单元格数组。

所以我想我可以将其更改为:

let cell = tableView.dequeueReusableCell(withIdentifier: "LabelCell", for: indexPath)
                    as! type(of:allCells[indexPath.row])

但是没有。编译器对此抱怨:

Cannot create a single-element tuple with an element label

也许这只是愚蠢的,但我不明白为什么它行不通。有人可以帮我弄清楚发生了什么事吗?

3 个答案:

答案 0 :(得分:1)

我在应用程序中使用了类似的东西,这就是我解决此问题的方式

    extension UITableViewCell {
         @objc func configure(_ data: AnyObject) {}
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let data = info.sectionInfo[indexPath.section].data[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: data.identifier.rawValue, for: indexPath)
        cell.configure(data as AnyObject)
        return cell
    }

    class DefaultCell: UITableViewCell {

    override func configure(_ data: AnyObject) {
        guard let data = data as? MyDesiredClass
            else {
                return
        }
        // do smth
    }

}

在这种情况下,您不需要直接传递单元格类型,因为任何单元格都包含configure func,您可以在其中填充所有字段

答案 1 :(得分:0)

您发出的是某种语法错误,在您提供的代码中不可见。

但是请改用泛型:

定义如下内容:

protocol Reusable: UIView {
    static var identifier: String { get }
}

将其扩展为UITableViewCell

extension Reusable where Self: UITableViewCell {
    static var identifier: String {
        return String(describing: self)
    }
}

使其符合单元格:

extension HeadlineTableViewCell: Reusable {}

将此扩展名添加到UITableView

extension UITableView {
    func dequeueReusableCell<T: UITableViewCell & Reusable>(type cellType: T.Type, for indexPath: IndexPath) -> T {
        return dequeueReusableCell(withIdentifier: cellType.identifier, for: indexPath) as! T
    }
}

并像这样使用它:

myTableView.dequeueReusableCell(type: HeadlineTableViewCell.self, for: indexPath)

这将同时使其出队并投放

答案 2 :(得分:0)

我假设 allCells 是一个包含表视图单元格列表的数组,但是这些单元格具有不同的类类型。

您在此使用的这一行不能以您尝试使用的方式使用。

type(of:allCells[indexPath.row])

这就是为什么您会收到错误消息。此函数返回对象元类型,您不能以上面尝试的方式使用该结果。您可能还应该研究可选选项的工作方式以及如何解开它们,因为您尝试执行此操作的方式将行不通。您在下面的这行代码可以正常工作,但是使用type(of :)语法进行拆包将无法正常工作:

let cell = tableView.dequeueReusableCell(withIdentifier: "LabelCell", for: indexPath) as! HeadlineTableViewCell

老实说,使用数组存储tableViewCells的整个体系结构是错误的,我什至不知道您要这样做是什么,但是我几乎100%可以说这是一个非常糟糕的主意。相反,数组应该存储tableViewCell将要显示的数据。

老实说,如果我是您,我会查找有关表视图的教程,因为我觉得这里对表视图的工作方式存在很多误解,导致您编写的代码和所遇到的问题。

查看本教程here。它应该可以帮助您更好地了解事物的工作原理。