UITableView 里面的 UICollecionView。如何处理选择?

Posted

技术标签:

【中文标题】UITableView 里面的 UICollecionView。如何处理选择?【英文标题】:UICollecionView inside UITableView. How to handle selections? 【发布时间】:2019-03-19 12:07:14 【问题描述】:

我正在制作一个包含多种单元格类型的tableView 表单。其中一种类型包含一个带有按钮的 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
    

谢谢

【问题讨论】:

您可以创建您的委托,当用户单击集合视图单元格时,在您放置 TableView 委托和数据源的 ViewController 中调用该委托。 【参考方案1】:

有四个步骤可以做到这一点:-

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.Third 将 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")
    

我希望这能解决您的问题,如果您觉得此答案有帮助,请告诉我。 干杯!!

【讨论】:

是的,这似乎让我更接近了!但我很抱歉,我不知道协议是如何工作的,因此我不知道什么时候调用了“method1”。我按照您的步骤操作,但是当我选择某些项目时,什么都没有打印出来,所以我想我一定错过了一些东西 “协议的工作原理”如果你是初学者很难理解,但做一些研究你就会明白。 method1 将从 collectionview 单元格中调用,并在您设置 cell.customDelegate = self 的视图控制器中反映。 这是我所需要的,我会做一些研究以更接近。非常感谢!

以上是关于UITableView 里面的 UICollecionView。如何处理选择?的主要内容,如果未能解决你的问题,请参考以下文章

UIView里面的UITableView? [关闭]

UITableView 里面的 UICollecionView。如何处理选择?

UIGestureRecognizer 处理 UITableView 中的触摸

IOS 自己定义UITableView

UITableView HeaderView,FooterView 使用SnapKit布局导致约束异常

带有 AutoLayout 的 UIScrollView 内的 UITableView 动态内容大小高度