【问题标题】:Navigate to view controller from Tableview cell inside collectionview从 collectionview 内的 Tableview 单元格导航到视图控制器
【发布时间】:2019-05-23 11:50:57
【问题描述】:

所以我在collectionview 中嵌入了tableview。 我有用于 tableview 的 xib。 当用户选择 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)


    }

}

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

【问题讨论】:

  • 为什么要创建与当前导航控制器无关的导航控制器,您可以将navigationController?.pushViewController(vc!, animated: true) 替换为self.navigationController.push...
  • self.navigationController.pushViewController 也抛出错误。
  • 好的。您需要从 CollectionView Cell -> ViewController 实现委托或协议,因为 DetailCollectionViewCell 不是视图控制器,因此您无法从那里推送或呈现视图控制器
  • @dahiya_boy 它是重复的,但你要回答的链接与这个不同
  • @PrashantTukadiya 首先 OP 必须设置导航控制器的根 VC。如果在窗口中创建了 NavController,那么他可以直接推送到下一个 VC。每一件事都是答案,那答案又有何不同?

标签: ios uitableview uinavigationcontroller swift4


【解决方案1】:

您有以下选择

1) 在viewController中实现tableview数据源和delgate,而不是collection view cell
2)使用委托(解释如下)
3) 使用闭包
4) 使用通知中心

您需要创建委托或协议,因为集合视图单元无法推送或呈现视图控制器。

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

创建协议

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

在你的collectionview单元格中添加弱属性

weak var delegate:TableViewInsideCollectionViewDelegate?

现在在你的 ViewController 类中你在 collectionview 的 cellForItem 方法中 您需要将委托设置为自我

喜欢

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

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

现在在 Goto Collectionview 单元格方法中

每当你的 tableviewDidSelect 调用时

调用像self.delegate?.cellTaped(data: dataYouWantToPass)这样的委托方法

希望对你有帮助

【讨论】:

    【解决方案2】:

    你必须检查一些信息:

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

      让 storyboard = UIStoryboard(name: "Main", bundle: nil)

      让 viewController = storyboard.instantiateViewController(withIdentifier: "StoryboardIdentifier") 作为?视图控制器

    【讨论】:

      【解决方案3】:

      您可以通过使用委托模式来解决此问题,具体步骤如下:

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

      代码示例:

      • 第 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 中,您可以确认集合视图的委托并实现其委托方法并可以处理导航。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多