我一直在尝试使用不同的自定义单元格类型填充单个tableview时遇到问题。我试图删除代码中所有不相关的部分。我可能有很多后续问题但是在dequereusablecell语句中(在cellforrow函数中),我无法将单元格向下转换为存储在数组cellTypes中的FilterTableViewCell或FilterTableViewCell2类型 。我得到错误“数组类型现在用元素类型的括号写”...它认为我试图向下转换为数组类型而不是数组cellTypes的给定索引中的单元格类型。我希望这很清楚。
我还尝试在switch语句的每种情况下放置一个dequereusablecell语句,但是我的代码的其他部分出现错误。它基本上将FIlterTableViewCell和FilterTableViewCell2视为它们是基类类型(UITableViewCell),因此它无法访问这两个子类中的属性。我希望有点清楚。但如果您在我的代码的其他部分(特别是我如何使用数组)中发现任何问题,请告诉我。
代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch properties[indexPath.item]{
case "Diet","Body Type":
let cell = tableView.dequeueReusableCell(withIdentifier: cellIDs[indexPath.row], for: indexPath) as! FilterTableViewCell
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(donePicker))
toolBar.setItems([doneButton], animated: false)
cell.valueTextField.inputAccessoryView = toolBar
cell.valueTextField.inputView = myUIPicker
cell.backgroundColor = UIColor.clear
cell.property.text = properties[indexPath.item]
cell.isUserInteractionEnabled = true
cell.valueTextField.isUserInteractionEnabled = true
cell.valueTextField.delegate = self
cell.valueTextField.tag = indexPath.item
toolBar = UIToolbar()
toolBar.sizeToFit()
reminderCells[indexPath.item] = cell
return cell
case "Looking For","Ethnicity":
let cell = tableView.dequeueReusableCell(withIdentifier: cellIDs[indexPath.row], for: indexPath) as! FilterTableViewCell2
multiplePicker.frame = CGRect(x: 0, y: 0, width: 100, height: 300)
multiplePicker.myValues = ethnicityOpts as! [String]
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(donePicker2))
toolBar.setItems([doneButton], animated: false)
cell.valueTextField.inputAccessoryView = toolBar
cell.valueTextField.inputView = multiplePicker
cell.backgroundColor = UIColor.clear
cell.property.text = properties[indexPath.item]
cell.isUserInteractionEnabled = true
cell.valueTextField.isUserInteractionEnabled = true
cell.valueTextField.delegate = self
cell.valueTextField.tag = indexPath.item
toolBar = UIToolbar()
toolBar.sizeToFit()
reminderCells[indexPath.item] = cell
return cell
default:
print("default")
}
在Matt的响应之后编辑对cellForRowAt(这次我在编译时指定类型):
{{1}}
答案 0 :(得分:0)
dequeue
cellForRowAt
来自as! cellTypes[indexPath.row]
的这个想法是巧妙而自然的,但却是非法的:
as!
Swift不会让你(cellForRowAt
)转换为直到运行时才指定的类型。它是一种静态语言,而不是动态语言。该类型必须是在编译时指定的 literal 类型。
您只需要将dequeue
实现拆分为两个完全独立的切换案例,一个用于行0和1,一个用于行2和3,并为每个切换案例执行不同的cell
一个,每个人声明并指定自己的本地as! FilterTableViewCell
变量,其中有一个演员as! FilterTableViewCell2
或cell
字面上 - 并从那里继续,单独,在每种情况下。
您无法将这两种情况统一为优雅外观的代码,因为只有在var reminderCells = [FilterTableViewCell(),FilterTableViewCell(),
FilterTableViewCell2(),FilterTableViewCell2()]
输入字面的情况下,如FilterTableViewCell或FilterTableViewCell2才能访问属性属性各自的类型。
至于这个表达:
reminderCells
......这里的问题是Swift只能推断出它必须是一个UITableViewCell数组,它没有FilterTableViewCell属性。
你可以通过定义第三种类型来解决这个问题,例如: FilterTableViewCellParent,作为FilterTableViewCell和FilterTableViewCell2的公共超类,并为它提供它们可以继承的公共属性; addMarker
可以是FilterTableViewCellParent的数组,您可以通过它的元素访问属性。 (当然,你可以使FilterTableViewCell成为FilterTableViewCell2的超类,或者反之亦然,因此只需要两种类型。)
但我个人认为你应该放弃你的“优雅”的尝试,只是在开关的两种情况下完全分开,即使是以一些重复为代价。有时一个人必须按照超人进入裤子的方式进行编程;他可能是超人,但他仍然需要一次进入一条腿。