UITableView内的UICollecionView。如何处理选择?

时间:2019-03-19 12:07:15

标签: ios swift uitableview uicollectionview

我正在使用带有多种单元格类型的tableView来创建表单。这些类型之一包含一个UICollectionView,该UICollectionView带有用于选择一些答案的按钮。

关于答案,我需要的是能够隐藏或显示表中的行。 例如:当问题2的答案为“否”时,问题3不再显示。

但是我不知道如何使该tableview知道在其中一个单元格中正在选择什么

在包含UICollectionView的单元格中,我有此方法

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    let indexPath = optionsCollectionView.indexPathsForSelectedItems?.first
    let cell = collectionView.cellForItem(at: indexPath!) as! OptionsCollectionViewCell
    let data = cell.itemButton.titleLabel?.text
    selectedItem = data

}

但是我不知道如何自动将其传递给tableview,因此它知道要显示或隐藏哪些行...知道吗?

这是我的cellForRowAt

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if sortedFixedContentType.count != 0 {
        let item = sortedFixedContentType[indexPath.row]

        switch item.typeId {
        case "42":
            let cell = tableView.dequeueReusableCell(withIdentifier: "FormFileCell", for: indexPath) as! FormFileCell
            return cell;
        case "39":
            let cell = tableView.dequeueReusableCell(withIdentifier: "FormExpenseTypeCell", for: indexPath) as! FormExpenseTypeCell


            return cell;
        case "86":
            let cell = tableView.dequeueReusableCell(withIdentifier: "FormExpensePaymentModeCell", for: indexPath) as! FormExpensePaymentModeCell
            return cell;
        case "87":
            let cell = tableView.dequeueReusableCell(withIdentifier: "FormExpenseFileTypeCell", for: indexPath) as! FormExpenseFileTypeCell

            return cell;
        case "88":
            let cell = tableView.dequeueReusableCell(withIdentifier: "FormProviderCell", for: indexPath) as! FormProviderCell
            return cell;
        default:
            let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! BaseFormCell
            cell.idLabel.text = item.htmlType
            return cell
        }
    }
    else {
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! BaseFormCell
        cell.idLabel.text = ""
        return cell
    }
}

谢谢

1 个答案:

答案 0 :(得分:3)

执行此操作有四个步骤:-

1。首先创建一个协议,在您正在使用collectionview的自定义单元格中说“ CustomCellDelegate”,然后创建一个变量来保存该自定义委托,仅举一个例子,假设您的单元格名称为CustomCell,请创建一个CustomCellDelegate并声明作为customDelegate

protocol CustomCellDelegate : class {
    func Method1()
}

class CustomCell : UITableViewCell {
    var customDelegate : CustomCellDelegate?
}

2。然后,您需要像这样从CustomCell类collectionview委托方法didSelectItemAt触发该委托

extension CustomCell : UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if let delegate = customDelegate {
            delegate.Method1()
        }
    }
}

3。第三次将customDelegate分配给您要在其中获取委托的视图控制器,例如,此处的myViewController

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "customeCellIdentifier", for: indexPath) as! CustomCell
    cell.customDelegate = self // myViewController
    return cell
}

4。像这样在您的视图控制器中处理委托

extension myViewController : CustomCellDelegate {
    func Method1() {
        print("Method 1 called")
    }
}

我希望这可以解决您的问题,如果您认为此答案有帮助,请告诉我。 干杯!