将不同的自定义单元格类型放在tableview中

时间:2018-05-20 15:41:25

标签: arrays swift uitableview custom-cell

我一直在尝试使用不同的自定义单元格类型填充单个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}}

1 个答案:

答案 0 :(得分:0)

dequeue cellForRowAt来自as! cellTypes[indexPath.row] 的这个想法是巧妙而自然的,但却是非法的:

as!

Swift不会让你(cellForRowAt)转换为直到运行时才指定的类型。它是一种静态语言,而不是动态语言。该类型必须是在编译时指定的 literal 类型。

您只需要将dequeue实现拆分为两个完全独立的切换案例,一个用于行0和1,一个用于行2和3,并为每个切换案例执行不同的cell一个,每个人声明并指定自己的本地as! FilterTableViewCell变量,其中有一个演员as! FilterTableViewCell2cell 字面上 - 并从那里继续,单独,在每种情况下。

您无法将这两种情况统一为优雅外观的代码,因为只有在var reminderCells = [FilterTableViewCell(),FilterTableViewCell(), FilterTableViewCell2(),FilterTableViewCell2()] 输入字面的情况下,如FilterTableViewCell或FilterTableViewCell2才能访问属性属性各自的类型。

至于这个表达:

reminderCells

......这里的问题是Swift只能推断出它必须是一个UITableViewCell数组,它没有FilterTableViewCell属性。

你可以通过定义第三种类型来解决这个问题,例如: FilterTableViewCellParent,作为FilterTableViewCell和FilterTableViewCell2的公共超类,并为提供它们可以继承的公共属性; addMarker可以是FilterTableViewCellParent的数组,您可以通过它的元素访问属性。 (当然,你可以使FilterTableViewCell成为FilterTableViewCell2的超类,或者反之亦然,因此只需要两种类型。)

但我个人认为你应该放弃你的“优雅”的尝试,只是在开关的两种情况下完全分开,即使是以一些重复为代价。有时一个人必须按照超人进入裤子的方式进行编程;他可能是超人,但他仍然需要一次进入一条腿。