如何从UICollectionViewCell中的UITableViewCell内部推送视图?

时间:2018-07-23 04:29:10

标签: ios swift uitableview uinavigationcontroller

我在UITableView内有一个UICollectionViewCell,我正在尝试从UITableViewCell方法内的tableView(_:didSelectRowAt:)推送新视图。但是,我无法访问navigationController。我将如何导航到新视图?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    var item = Item(name: "")

    switch indexPath.section {
    case 0:
        item = array1![indexPath.item]
    case 1:
        item = array2![indexPath.item]
    default:
        break
    }

    let layout = UICollectionViewFlowLayout()
    let newView = NewCollectionView(collectionViewLayout: layout)
    newView.itemOfInterest = item

    // Can't reference navigationController
}

3 个答案:

答案 0 :(得分:0)

为此

1。您需要在添加了tableview的collectionviewcell中声明一个协议

2。在添加collectionview的类上实现protocol方法。并点击此处处理导航

3。在调用indexpath方法的collectionviewCellForrow时设置collectionview单元格委托,并在collectionview单元格中单击tableview项时调用委托方法。

答案 1 :(得分:0)

获取当前视图的父控制器-

//MARK: get parent controller...
extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}

用法:-parentViewController?.navigationController

的形式获取navigationController参考
let viewController = GymLearnMoreViewController(nibName: "GymLearnMoreViewController", bundle: nil) //Your View controller instance
parentViewController?.navigationController?.pushViewController(viewController, animated: true)

来源Apple:-

https://developer.apple.com/documentation/uikit/uiresponder/1621099-next https://developer.apple.com/documentation/uikit/uiresponder?changes=_9

答案 2 :(得分:0)

一种方法是使用NotificationCenter,您可以在ParentViewController中编写:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(methodNavigate(notification:)), name: NSNotification.Name(rawValue: "NavigateToSecondView"), object: nil)
}

@objc func methodNavigate(notification: NSNotification) {
    Write your push segue code here.
}

别忘了删除viewDidDisappear中的观察者:

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "NavigateToSecondView"), object: nil)
}

您也可以通过它传递数据。

然后进入didSelectRowAt

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NavigateToSecondView"), object: "Send Data Here")

但是我建议使用协议是更好,更优雅的方法。 您可以在互联网上获得很多教程和示例:

希望有帮助。编码愉快。