从collectionview内的Tableview单元导航到视图控制器

时间:2018-12-24 09:07:49

标签: ios uitableview uinavigationcontroller swift4

因此,我在collectionview中嵌入了tableview。 我有xib用于tableview。 当用户选择tableview的单元格时,我想导航到另一个视图控制器。

我尝试了这种方法,但是不起作用

let storyboardId = "Login"
        let vc = storyboard?.instantiateViewController(withIdentifier: storyboardId) 
        navigationController?.pushViewController(vc!, animated: true)

但是它不起作用,因为该视图控制器未添加到导航堆栈中。

    class DetailCollectionViewCell: UICollectionViewCell, UITableViewDelegate,UITableViewDataSource {


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

//        let navigationController = UINavigationController()
//        let storyboardId = "Login"
//        let vc = storyboard?.instantiateViewController(withIdentifier: storyboardId)
//        navigationController?.pushViewController(vc!, animated: true)


    }

}

我该如何解决此问题。 任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

您有以下选择

1)实现tableview数据源并在viewController中代替集合视图单元进行委托
2)使用委托(如下所述)
3)使用封闭件
4)使用NotificationCenter

您需要创建委托或协议,因为集合视图单元不能推送或显示视图控制器。

这是一个简单的示例(这不是您可能需要修改的确切代码)

创建协议

protocol TableViewInsideCollectionViewDelegate:class {
    func cellTaped(data:IndexPath)
}

在collectionview单元格内添加弱属性

weak var delegate:TableViewInsideCollectionViewDelegate?

现在在ViewController类中,您可以使用collectionview的cellForItem方法  您需要将委托设置为self

喜欢

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCell", for: indexPath) as! CustomCollectionCell
    cell.delegate = self
    return cell

并在viewController类中实现委托方法,并编写代码以像self.navigationController.push那样从那里推送视图控制器

现在进入“转到Collectionview单元格”方法

,只要您的tableviewDidSelect调用

调用委托方法,例如self.delegate?.cellTaped(data: dataYouWantToPass)

希望对您有帮助

答案 1 :(得分:0)

您必须检查一些信息:

  • 首先: 检查您的navigationController是否为空
  • 第二个: 检查您的初始视图控制器方法是否正确, 这是我的方式:

    让Storyboard = UIStoryboard(名称:“ Main”,捆绑包:nil)

    让viewController = storyboard.instantiateViewController(withIdentifier:“ StoryboardIdentifier”)为? ViewController

enter image description here

答案 2 :(得分:0)

您可以通过使用委派模式来解决此问题,请执行以下步骤:

  • 确认表视图委托给集合视图,集合视图委托给各自的视图控制器。
  • 授权链可用于解决此问题。在此示例中,我展示了如何将数据从表视图单元传递到集合视图单元。
  • 实现集合视图委托和数据源方法。
  • 实现表视图委托和数据源方法。
  • 无论何时选择行,都会调用调用委托方法,以告知视图控制器已选择了某些行,并根据行索引的更改来处理导航。

代码示例:

  • 第1步:创建协议。

    protocol RowSelected : class {
     func rowSelected(_ index : Int)
    }
    
  • 步骤2:在TableViewCell中声明委托变量。

    weak var delegate: RowSelected?
    
  • 步骤3:在集合视图中,确认委托并实现委托方法。

      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier", for: indexPath) as! CollectionViewCell
      cell.delegate = self
      return cell
    
      extension CollectionViewCell : RowSelected {
         func rowSelected() {
          // Pass the information to view controller via a delegate/closure/notification. just like we passed information from table view cell to collection view cell and handle navigation accordingly.
         }
      }
    
  • 第4步:在ViewController中,您可以确认集合视图的委托并实现其委托方法并可以处理导航。

您也可以使用关闭和通知中心来通知视图控制器导航到下一个屏幕。