我有这个在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
也许这只是愚蠢的,但我不明白为什么它行不通。有人可以帮我弄清楚发生了什么事吗?
答案 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。它应该可以帮助您更好地了解事物的工作原理。