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。如何处理选择?的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 里面的 UICollecionView。如何处理选择?
UIGestureRecognizer 处理 UITableView 中的触摸