因此,我在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)
}
}
我该如何解决此问题。 任何帮助表示赞赏。
答案 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
答案 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中,您可以确认集合视图的委托并实现其委托方法并可以处理导航。
您也可以使用关闭和通知中心来通知视图控制器导航到下一个屏幕。