如何在选择集合视图单元格时显示不同的视图控制器

Posted

技术标签:

【中文标题】如何在选择集合视图单元格时显示不同的视图控制器【英文标题】:How to show different view controller on did select of collectionv view cell 【发布时间】:2017-09-15 10:17:37 【问题描述】:

我有 3 个视图控制器,分别称为 firstvcsecondvcthirdvc。我有一个可以水平滚动的集合视图。我已经做到了。如果我选择任何单元格,它将打印它是哪个索引路径。没事,没问题。所以在我的mainviewcontroller 中,我有一个可以水平滚动的集合视图。还有一个UIView 叫做myview。每当我按下任何单元格时,我都会得到它的indexPath。我需要在我的mainviewcontroller 中将我的 3 个视图控制器显示为myview 的子视图。

到目前为止我的代码:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
    // handle tap events
    print("You selected cell #\(indexPath.item)!")
    if indexPath.item == 0 
         let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
         if let allCollectionViewController = alertStoryBoard.instantiateViewController(withIdentifier:"firstvc") as? firstvc 
             self.contentSubView.addSubview(allCollectionViewController)
          else if indexPath.item == 1 
            
          else if indexPath.item == 2 
            
         
    

我在这一行遇到错误:

 self.contentSubView.addSubview(allCollectionViewController)

Cannot convert value of type 'firstvc' to expected argument type 'UIView'

我该如何解决这个问题。

提前致谢!!

更新:

如果 indexPath.item == 0

    let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
    
    
    if  let allCollectionViewController = alertStoryBoard.instantiateViewController(withIdentifier:"firstvc") as? firstvc  
        
       
        
          self.contentSubView.addSubview(allCollectionViewController.view)
        

    
    
 else if indexPath.item == 1 
        
        
        let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
        
        
        if  let allCollec = alertStoryBoard.instantiateViewController(withIdentifier:"secondvc") as? secondvc  
       
            self.contentSubView.addSubview(allCollec.view)

    
else if indexPath.item == 2 
       
            let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
            
            
            if  let wController = alertStoryBoard.instantiateViewController(withIdentifier:"Thirdvc") as? Thirdvc  
       
                self.contentSubView.addSubview(wController.view)


只显示第一个vc类,不显示第二个和第三个。另外,为什么我关注 lk 这意味着。每当我按下任何集合视图单元格时,该特定类视图控制器都必须显示在我的mainviewcontroller 中的 uiview 子视图中@

在我的第一个视图控制器中,我放置了一个带有一些背景颜色的 uiview。但根本没有显示。它显示的是白色。也没有正确显示

【问题讨论】:

self.contentSubView.addSubview(allCollectionViewController.view)一样使用 @Anbu.Karthik 请看我更新的帖子 根据你的myview设置框架 意思是,我是否需要在我的第一个 vc 中添加该帧或在哪里...请告诉我一些代码解决方案 你能添加一些你期望什么类型的 OP 的 UI 【参考方案1】:

您可以推送当前视图控制器,但不能将视图控制器添加为子视图。

如果你想添加为子视图,那么你可以这样做,

  self.contentSubView.addSubview(allCollectionViewController.view)

如果你有类似的导航控制器,请推送 viewcontroller

 navigationController?.pushViewController(allCollectionViewController, animated: true)

或者像这样展示它

 present(allCollectionViewController, animated: true)  

    

【讨论】:

@LionAny 解决方案请***.com/questions/46251141/…【参考方案2】:
//Do this:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "someViewController")
self.present(controller, animated: true, completion: nil)

//You have to present your view controller and what you are doing is adding it as a sub view.

【讨论】:

【参考方案3】:

喜欢

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
// handle tap events
print("You selected cell #\(indexPath.item)!")

    based on your comment remove the subviews before add on your myview

    for subview in contentSubView.subviews 
          subview.removeFromSuperview()
    

    let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
    var controller: UIViewController!

if indexPath.item == 0 

    if  let allCollectionViewController = alertStoryBoard.instantiateViewController(withIdentifier:"firstvc") as? firstvc  

        controller = allCollectionViewController
      

 else if indexPath.item == 1 

        if  let allCollec = alertStoryBoard.instantiateViewController(withIdentifier:"secondvc") as? secondvc  
       controller = allCollec
       


else if indexPath.item == 2 


            if  let wController = alertStoryBoard.instantiateViewController(withIdentifier:"Thirdvc") as? Thirdvc  
       controller = wController
    



   addChildViewController(controller)

 // Add the child's View as a subview
  contentSubView.addSubview(controller.view)
  controller.view.frame = contentSubView.bounds
  controller.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

  // tell the childviewcontroller it's contained in it's parent
   controller.didMove(toParentViewController: self)

【讨论】:

供您参考我的项目 zip dropbox.com/s/fwj745kdgqvgjxa/… 我也会检查上述一种解决方案 @spikesa - 我的答案会起作用,我检查了示例项目 @spikesa - 从这里下载更新的项目sendspace.com/file/mhkuff 是的,但有一个疑问..它可能像..如果我向右或向左滑动contentSubView,特定的下一个视图控制器也必须显示相同的我的收藏视图单元格也必须突出显示基于视图存在于 contentSubView 下【参考方案4】:

错误非常明显。您只能根据此定义使用 addSubview:

open func addSubview(_ view: UIView)

如果你想在一个视图控制器中使用多个视图控制器,我建议使用容器视图控制器。

试试这个教程:https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/

否则一个简单的方法是使用:

self.contentSubView.addSubview(allCollectionViewController.view)

然后您可以在视图上使用约束来管理多个视图控制器。

【讨论】:

以上是关于如何在选择集合视图单元格时显示不同的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

选择表格视图单元格时显示自定义 UIImageView

滚动时显示重复数据的 CollectionView 单元格?

如何根据集合视图中的单元格选择来控制表格视图的内容?

自定义表格视图单元格中的 UITextField。点击单元格/文本字段时显示选择器视图

按下单元格中的按钮时显示新视图

为啥我在自定义单元格中的复选框在快速选择和滚动时显示不同的行为?